获取数据框:
df = pd.DataFrame(np.array([['a',0,3],
['b',3,3],
['c',5,6],
['a',3,4]
,['b',0,2]]), columns=['id','y','z'])
df
Out[3]:
id y z
0 a 0 3
1 b 3 3
2 c 5 6
3 a 3 4
4 b 0 2
我想删除y列上值为0的所有重复项。请参阅下面的尝试:
df.loc[(~df.duplicated('id')) | ((df.duplicated('id'))&(df['y'].astype(int)>0)),:]
Out[4]:
id y z
0 a 0 3
1 b 3 3
2 c 5 6
3 a 3 4
正如你所看到的那样它只删除了一个重复但留下了另一个 - 这是因为项目“a”的重复值在非零值为3之前带有y值0.有没有办法解决这个问题使用groupbys和排序等?
由于
答案 0 :(得分:0)
您可以使用keep=False
将所有重复的案例标记为True
:
df[~df.id.duplicated(keep=False) | (df.id.duplicated(keep=False) & (df.y.astype(int) > 0))]
# id y z
#1 b 3 3
#2 c 5 6
#3 a 3 4
默认情况下,duplicated()
将first
作为参数,第一次出现不会被视为重复,以下是其他一些示例:
df.id.duplicated()
#0 False
#1 False
#2 False
#3 True
#4 True
#Name: id, dtype: bool
#df.id.duplicated(keep=False) # all duplicated ids are marked as True
#0 True
#1 True
#2 False
#3 True
#4 True
#Name: id, dtype: bool
答案 1 :(得分:0)
重复功能可以选择返回系列中的所有重复值。更多详情:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.duplicated.html
您可以简单地切割与您的条件完全匹配的原始DataFrame。
# keep only what is not duplicated and equals to 0
df[~(df['id']duplicated(False) & (df['y']=='0'))]
我建议为'y'列'修复'你的dtype,因为当前是你的例子中的一个字符串。只要确保它是正确的dtype('int'或'string'),以防止任何不必要的问题!