我经常尝试执行以下操作,但是有一个立即解决方案,在熊猫中最有效:
我有以下示例pandas DataFrame,其中有两列Name
和Age
:
import pandas as pd
data = [['Alex',10],['Bob',12],['Barbara',25], ['Bob',72], ['Clarke',13], ['Clarke',13], ['Destiny', 45]]
df = pd.DataFrame(data,columns=['Name','Age'], dtype=float)
print(df)
Name Age
0 Alex 10.0
1 Bob 12.0
2 Barbara 25.0
3 Bob 72.0
4 Clarke 13.0
5 Clarke 13.0
6 Destiny 45.0
我想删除在Name
中具有匹配值的所有行。在示例df
中,有两个Bob
值和两个Clarke
值。因此,预期的输出为:
Name Age
0 Bob 12.0
1 Bob 72.0
2 Clarke 13.0
3 Clarke 13.0
据此我假设有一个重置索引。
一种选择是将Name
的所有唯一值保留在列表中,然后遍历数据框以检查重复的行。那将是非常低效的。
此任务有内置功能吗?
答案 0 :(得分:3)
使用drop_duplicates
,仅获取被删除的对象:
print(df[~df['Name'].isin(df['Name'].drop_duplicates(False))])
输出:
Name Age
1 Bob 12.0
3 Bob 72.0
4 Clarke 13.0
5 Clarke 13.0
如果关心索引,请执行以下操作:
print(df[~df['Name'].isin(df['Name'].drop_duplicates(False))].reset_index(drop=1))
输出:
Name Age
0 Bob 12.0
1 Bob 72.0
2 Clarke 13.0
3 Clarke 13.0
答案 1 :(得分:3)
使用duplicated
df[df.Name.duplicated(keep=False)]
Name Age
1 Bob 12.0
3 Bob 72.0
4 Clarke 13.0
5 Clarke 13.0