我有一个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_count
和pandas.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