gab*_*how 7 python duplicates dataframe 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
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以添加引用第一个重复项的索引的列(保留一个)
duplicate
Out[16]:
col1 col2 index_original
2 1 2 0
4 1 2 0
Run Code Online (Sandbox Code Playgroud)
注意:在我的情况下,df可能非常大。
Mer*_*jff 11
也许您不再需要这个答案,但还有另一种方法可以查找重复的行:
df=pd.DataFrame(data=[[1,2],[3,4],[1,2],[1,4],[1,2]],columns=['col1','col2'])
Run Code Online (Sandbox Code Playgroud)
考虑到上面的 DataFrame,您可以使用 groupby 而不会有任何戏剧性,但对于较大的 DataFrame,它会有点慢,而不是您可以使用
DataFrame.duplicate(subset=None, keep='first')
返回表示重复行的布尔系列。
正如文档所述,它返回一个布尔系列,换句话说,一个布尔掩码,因此您可以使用该掩码操作 DataFrame,或者只是可视化重复的行:
>>> df[df.duplicated()]
col1 col2
2 1 2
4 1 2
Run Code Online (Sandbox Code Playgroud)
如果您有一个包含更多列的 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'])
Run Code Online (Sandbox Code Playgroud)
如果您想查找所有列的重复行并将其可视化,只需执行以下操作:
>>> df[df.duplicated()]
Name Age City
3 Riti 30 Delhi
4 Riti 30 Delhi
Run Code Online (Sandbox Code Playgroud)
但是,如果您只想查找重复的行,只考虑两列,例如“姓名”和“年龄”,只需执行以下操作:
>>> df[df.duplicated(['Name', 'Age'])]
Name Age City
3 Riti 30 Delhi
4 Riti 30 Delhi
5 Riti 30 Mumbai
Run Code Online (Sandbox Code Playgroud)
或者只是一列,例如“名称”:
>>> df[df.duplicated(['Name'])]
Name Age City
3 Riti 30 Delhi
4 Riti 30 Delhi
5 Riti 30 Mumbai
6 Aadi 40 London
Run Code Online (Sandbox Code Playgroud)
上面的示例仅返回重复的行,而不是“原始行”,因此如果您查看示例,如果按照给定条件存在三个重复行,则只会返回两个。
使用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
Run Code Online (Sandbox Code Playgroud)
细节
我groupby
先输入两列,然后调用transform
+ idxmin
以获取每个组的第一个索引。
df.groupby(['col1', 'col2']).col1.transform('idxmin')
0 0
1 1
2 0
3 3
4 0
Name: col1, dtype: int64
Run Code Online (Sandbox Code Playgroud)
duplicated
给我一个我想保留的布尔值掩码:
df.duplicated(subset=['col1','col2'], keep='first')
0 False
1 False
2 True
3 False
4 True
dtype: bool
Run Code Online (Sandbox Code Playgroud)
其余的只是布尔索引。
归档时间: |
|
查看次数: |
9148 次 |
最近记录: |