首页 > 解决方案 > Python:删除多个条件的空值和重复项

问题描述

我是 python 新手,经过大量研究和测试,我仍然无法解决这个问题。

我试图在某些条件下删除空值和重复项,基本上我应该留下唯一的“ID”。我可以使用 .duplicated 然后 .drop_duplicates 和 .dropna 来删除我的数据帧子集的相关行,但我无法弄清楚如何在不删除我想要保留的行的情况下将它们全部放在原始数据帧上。

我还想将所有删除的记录保存在一个单独的数据框中,但还没有想到这怎么可能。

条件;

数据框;

df = pd.DataFrame(columns=['ID','code','type'])
df.ID = [1,1,2,2,3,3,4,5,6,6,7,7]
df.code = ['a',np.nan,'b','c','d','d','a',np.nan,'e','f','g',np.nan]
df.type = ['type1','type1','type2','type2','type1','type2','type3','type1','type1','type2','type1','type2']

    ID  code    type
0   1   a   type1
1   1   NaN type1
2   2   b   type2
3   2   c   type2
4   3   d   type1
5   3   d   type2
6   4   a   type3
7   5   NaN type1
8   6   e   type1
9   6   f   type2
10  7   g   type1
11  7   NaN type2

生成的数据框应如下所示;

    ID  code    type
0   1   a   type1
1   2   b   type2
2   4   a   type3
3   5   NaN type1

目前,这是我为获得正确结果所做的事情,但我觉得有更好的方法。

df_unique = df.drop_duplicates(subset=['ID'],keep=False)

df_dupe = df[df.duplicated(['ID','type'],keep=False)]

df_dupe2 = df_dupe.dropna(subset=['code']).drop_duplicates(subset=['ID','type'])

df_final = pd.concat([df_unique,df_dupe2]).sort_values('ID')

任何建议将不胜感激。

标签: pythonpandas

解决方案


&您可以使用for bitwise AND|for bitwiseOR~for inverse链接掩码:

m1 = df.duplicated(subset=['ID'],keep=False)
m2 = df.duplicated(['ID','type'],keep=False) 
m3 = df.duplicated(['ID','type']) 
m4 = df['code'].notna()

df = df[~m1 | (m2 & ~m3 & m4)].sort_values('ID')
print (df)
   ID code   type
0   1    a  type1
2   2    b  type2
6   4    a  type3
7   5  NaN  type1
    

推荐阅读