pandas:条件为

时间:2017-02-08 23:02:15

标签: python pandas

获取数据框:

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和排序等?

由于

2 个答案:

答案 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'),以防止任何不必要的问题!