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()的详细信息,请参阅以下文章。
上一篇: 矩阵中提取无重复行的操作
下一篇: 4.23