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

6tr1vspr  于 2022-11-05  发布在  Python
关注(0)|答案(1)|浏览(174)

我将CSV文件中的数据读入Pandas Dataframe (所有单元格都是字符串类型,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值为“"的行。因此,所需的结果应如下所示:

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的一个重复项(发生在应保留的行之前的那个重复项)保留了下来。
有什么建议吗?我可能错过了一些东西就在我的鼻子下面。

hrysbysz

hrysbysz1#

您可以计算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)

或不使用groupby:

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

相关问题