基于另一列的条件删除一列中具有重复值的行-Python/Pandas



我有一个CSV文件中的数据读取到Pandas数据帧中(所有单元格都有字符串类型,NaN:s已经被替换为"(,其中有一些重复的值需要消除。

样本输入CSV:

Col1,Col2,Col3
A,rrrrr,fff
A,,ffff
B,rrr,fffff
C,,ffffff
D,rrrrrrr,ffff
C,rrrr,fffff
E,rrrrr,fff
C,,kkkkk

我需要移除那些在Col1中具有重复值并且其中Col2值为"0"的行&";。因此,期望的结果应该是这样的:

Col1,Col2,Col3
A,rrrrr,fff
B,rrr,fffff
D,rrrrrrr,ffff
C,rrrr,fffff
E,rrrrr,fff

我使用以下代码行来消除重复:

my_df = my_df.loc[(my_df["Col2"] != "") | ~my_df["Col1"].duplicated()]

这将删除Col1中的一些但不是所有具有重复项的所需行。如果这样的";重复行";在应该保留的行(作为非空的Col2(之前,它不会被删除,我的代码给出了这样的结果:

Col1,Col2,Col3
A,rrrrr,fff
B,rrr,fffff
C,,ffffff
D,rrrrrrr,ffff
C,rrrr,fffff
E,rrrrr,fff

如您所见,A的副本被正确删除,而C的副本之一(出现在应保留的行之前的副本(保留。

有什么建议吗?我可能在这里错过了什么。

您可以计算Col1中每个值的计数,然后使用该computed_countpandas.Series.isna()来获取所需内容。

df['cnt_col1'] = df.groupby('Col1')['Col1'].transform('count')
m = (df["Col2"].isna()) & (df["cnt_col1"]>1)
df_new = df[~m].drop('cnt_col1', axis=1)
print(df_new)

或不分组:

cnt = dict(df['Col1'].value_counts())
cnt_col1 = df['Col1'].map(cnt)
m = (df["Col2"].isna()) & (cnt_col1>1)
print(df[~m])

输出:

Col1     Col2   Col3
0    A    rrrrr    fff
2    B      rrr  fffff
4    D  rrrrrrr   ffff
5    C     rrrr  fffff
6    E    rrrrr    fff

最新更新