Python 熊猫:有条件的复制品

Python 熊猫:有条件的复制品,python,pandas,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

以数据帧为例:

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


谢谢

您可以使用
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

您可以使用
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

函数duplicated具有返回序列中所有重复值的选项。详情如下:

您可以简单地对与您的条件完全匹配的原始数据帧进行切片

# keep only what is not duplicated and equals to 0
df[~(df['id']duplicated(False) & (df['y']=='0'))]

我建议“修复”列“y”的数据类型,因为当前是示例中的字符串。只需确保它是正确的数据类型('int'或'string'),以防止任何不必要的问题

函数duplicated可以选择返回序列中的所有重复值。详情如下:

您可以简单地对与您的条件完全匹配的原始数据帧进行切片

# keep only what is not duplicated and equals to 0
df[~(df['id']duplicated(False) & (df['y']=='0'))]

我建议“修复”列“y”的数据类型,因为当前是示例中的字符串。只需确保它是正确的数据类型('int'或'string'),以防止任何不必要的问题

你能发布你想要的数据集吗?你能发布你想要的数据集吗?