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'),以防止任何不必要的问题 你能发布你想要的数据集吗?你能发布你想要的数据集吗?