23_Pandas.DataFrame,Series中提取・删除重复行

23_Pandas.DataFrame,Series中提取・删除重复行

从pandas.DataFrame和pandas.Series提取包含重复元素行的方法是duplicated(),删除包含重复元素行的方法是drop_duplicates()以将其删除。

以下面的数据为例。添加重复数据。

import pandas as pd

df = pd.read_csv('./data/23/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

df = df.append({'name': 'Dave', 'age': 68, 'state': 'TX', 'point': 70}, ignore_index=True)
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57
# 6     Dave   68    TX     70

该示例是pandas.DataFrame,但对于pandas.Series也是如此.

将描述以下内容。

  • 提取重复的行:duplicated()
    • 选择要保留的行:参数keep
    • 指定要检查重复项的列:参数subset
    • 计算重复行数
  • 删除重复的行:drop_duplicates()
    • 参数keep,subset
    • 参数inplace
  • 汇总重复的行:groupby()

提取重复的行:duplicated()

使用duplicated()方法获取布尔型pandas.Series,并将重复的行设置为True。默认情况下,如果所有列都匹配,则视为重复。

print(df.duplicated())
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5    False
# 6     True
# dtype: bool

可以使用生成的pandas.Series从原始pandas.DataFrame中提取重复的数据行。

print(df[df.duplicated()])
#    name  age state  point
# 6  Dave   68    TX     70

选择要保留的行:参数keep

默认情况下,设置参数keep =‘first’,并且第一行重复为False。保留第一行而不视为重复的图像。

如果keep =‘last’,则最后重复的行将为False。保留最后一行而不被视为重复的图像。

print(df.duplicated(keep='last'))
# 0    False
# 1    False
# 2    False
# 3     True
# 4    False
# 5    False
# 6    False
# dtype: bool

如果keep = False,则所有重复行均为true。

print(df.duplicated(keep=False))
# 0    False
# 1    False
# 2    False
# 3     True
# 4    False
# 5    False
# 6     True
# dtype: bool

指定要检查重复项的列:参数subset

如上所述,默认情况下,所有列匹配时都被视为重复。

可以指定要由参数子集判断的列。

print(df.duplicated(subset='state'))
# 0    False
# 1    False
# 2     True
# 3    False
# 4     True
# 5     True
# 6     True
# dtype: bool

可以在列表中指定多个列。当所有指定列的元素都匹配时,将考虑重复项。

print(df.duplicated(subset=['state', 'point']))
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5    False
# 6     True
# dtype: bool

计算重复行数

可以通过使用value_counts()计算出重复的()获得的pandas.Series的True来检查重复的行数。

有关value_counts(),请参见以下文章。

注意,结果取决于参数keep。根据目的正确使用。

print(df.duplicated().value_counts())
# False    6
# True     1
# dtype: int64

print(df.duplicated().value_counts()[True])
# 1

print(df.duplicated(keep=False).value_counts()[True])

删除重复的行:drop_duplicates()

通过使用重复的()和逻辑否定运算符〜,您可以获得删除重复行的DataFrame。

print(df[~df.duplicated()])
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

有一个drop_duplicates()方法执行类似的处理。

print(df.drop_duplicates())
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

参数keep,subset

同样在drop_duplicates()中,您可以像plicated()中那样设置keep和subset参数。

print(df.drop_duplicates(keep=False))
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

print(df.drop_duplicates(subset='state'))
#     name  age state  point
# 0  Alice   24    NY     64
# 1    Bob   42    CA     92
# 3   Dave   68    TX     70

参数inplace

默认情况下,返回删除了重复行的新DataFrame,但是如果参数inplace = True,则会从原始DataFrame中删除重复的行。

df.drop_duplicates(subset='state', keep='last', inplace=True)
print(df)
#     name  age state  point
# 4  Ellen   24    CA     88
# 5  Frank   30    NY     57
# 6   Dave   68    TX     70

汇总重复的行:groupby()

使用groupby()基于具有重复元素的列聚合值。

准备了诸如平均值,总和,最大值和最小值的方法。平均值(mean())仅适用于数字序列。

df = pd.read_csv('./data/23/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

print(df.groupby('state').mean())
#         age      point
# state                 
# CA     28.0  83.333333
# NY     27.0  60.500000
# TX     68.0  70.000000

也可以串联或列出字符串。

print(df.groupby('state').agg(
    {'name': lambda x: ','.join(x),
     'age': 'mean',
     'point': 'mean'}))
#                     name  age      point
# state                                   
# CA     Bob,Charlie,Ellen   28  83.333333
# NY           Alice,Frank   27  60.500000
# TX                  Dave   68  70.000000

print(df.groupby('state').agg(
    {'name': list,
     'age': 'mean',
     'point': 'mean'}))
#                         name  age      point
# state                                       
# CA     [Bob, Charlie, Ellen]   28  83.333333
# NY            [Alice, Frank]   27  60.500000
# TX                    [Dave]   68  70.000000

有关groupby()的详细信息,请参阅以下文章。

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值