我正在尝试在pandas数据框中查找重复行。
df=pd.DataFrame(data=[[1,2],[3,4],[1,2],[1,4],[1,2]],columns=['col1','col2'])
df
Out[15]:
col1 col2
0 1 2
1 3 4
2 1 2
3 1 4
4 1 2
duplicate_bool = df.duplicated(subset=['col1','col2'], keep='first')
duplicate = df.loc[duplicate_bool == True]
duplicate
Out[16]:
col1 col2
2 1 2
4 1 2
有没有办法添加一个引用第一个副本(保留的副本)索引的列
duplicate
Out[16]:
col1 col2 index_original
2 1 2 0
4 1 2 0
注意:在我的情况下,df可能非常大......
答案 0 :(得分:3)
使用groupby
,创建新的索引列,然后调用duplicated
:
df['index_original'] = df.groupby(['col1', 'col2']).col1.transform('idxmin')
df[df.duplicated(subset=['col1','col2'], keep='first')]
col1 col2 index_original
2 1 2 0
4 1 2 0
<强>详情
我groupby
前两列,然后调用transform
+ idxmin
获取每个组的第一个索引。
df.groupby(['col1', 'col2']).col1.transform('idxmin')
0 0
1 1
2 0
3 3
4 0
Name: col1, dtype: int64
duplicated
给我一个我想保留的值的布尔掩码:
df.duplicated(subset=['col1','col2'], keep='first')
0 False
1 False
2 True
3 False
4 True
dtype: bool
其余的只是布尔索引。
答案 1 :(得分:1)
也许你不再需要这个答案了,但还有另一种方法可以找到重复的行:
df=pd.DataFrame(data=[[1,2],[3,4],[1,2],[1,4],[1,2]],columns=['col1','col2'])
鉴于上面的数据帧,您可以使用 groupby 没有戏剧性,但使用更大的数据帧会有点慢,而不是您可以使用
<块引用>DataFrame.duplicated(subset=None, keep='first')
返回表示重复行的布尔系列。
正如 documenation 所说,它返回一个布尔系列,换句话说,一个布尔掩码,因此您可以使用该掩码操作 DataFrame,或者只是可视化重复的行:
>>> df[df.duplicated()]
col1 col2
2 1 2
4 1 2
如果您有一个包含更多列的 DataFrame 并且您想按特定列查找重复的行,您可以为该函数提供一个要查找的列列表,例如以下 DataFrame:
# List of Tuples
students = [('jack', 34, 'Sydeny'),
('Riti', 30, 'Delhi'),
('Aadi', 16, 'New York'),
('Riti', 30, 'Delhi'),
('Riti', 30, 'Delhi'),
('Riti', 30, 'Mumbai'),
('Aadi', 40, 'London'),
('Sachin', 30, 'Delhi')
]
# Create a DataFrame object
df = pd.DataFrame(students, columns=['Name', 'Age', 'City'])
如果您想按所有列查找重复的行并将其可视化,请执行以下操作:
>>> df[df.duplicated()]
Name Age City
3 Riti 30 Delhi
4 Riti 30 Delhi
但是如果您只想在仅考虑两列的情况下查找重复的行,例如“姓名”和“年龄”,只需执行以下操作:
>>> df[df.duplicated(['Name', 'Age'])]
Name Age City
3 Riti 30 Delhi
4 Riti 30 Delhi
5 Riti 30 Mumbai
或者只是像“名称”这样的一列:
>>> df[df.duplicated(['Name'])]
Name Age City
3 Riti 30 Delhi
4 Riti 30 Delhi
5 Riti 30 Mumbai
6 Aadi 40 London
上面的例子只返回了重复的行,而不是“原始的”,所以如果你看看这些例子,如果按照给定的条件有三个重复的行,那么只会返回两个。