欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 13:50:20
...

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()的详细信息,请参阅以下文章。