从 DataFrame 中删除空重复项

时间:2021-04-20 21:55:09

标签: python pandas dataframe

如果另一列中的值为空,我正在尝试从一行中删除重复项。这是一个示例数据框:

<头>
主要应用 分配给
应用1 吉姆·史密斯
应用1 nan
应用2 约翰·威廉姆斯
应用2 nan
应用3 nan
应用3 莎拉·史密斯

我正在尝试编写一个条件,如果 Assigned To 中重复项的第一个或第二个值为空,则删除 Primary Application 中的重复项。

理想的输出是:

<头>
主要应用 分配给
应用1 吉姆·史密斯
应用2 约翰·威廉姆斯
应用3 莎拉·史密斯

这是我目前所写的内容:

df = df.groupby('Primary Application', as_index=False).apply(
    lambda x: x.drop_duplicates(subset=['Primary Application'], keep='first'
    if x['Assigned To'].iat[1].isnull()
    else x.drop_duplicates(subset=['Primary Application'], keep='last')))

主要问题是关于 isnull() 的 if 语句。我也试过使用 is none 也没有奏效。

我应该添加到这个问题的一个关键点:我确实想保留一些 NA 值,而不是那些与已经分配的值重复的值。

2 个答案:

答案 0 :(得分:0)

您可以将自定义函数传递给 groupby.agg

import numpy as np

df.groupby('Primary Application', as_index=False).agg(lambda x: np.nan if x.isnull().all() else x.dropna(subset=['Assigned To']))

答案 1 :(得分:0)

另一种方式是通过 transform()。如果组大小为1,则保留它,否则保留组中的所有非nan。

用几个额外的案例来表示非重复情况:

d = {'Primary Application': ['Application 1 ','Application 1 ','Application 2 ',
    'Application 2 ','Application 3 ','Application 3 ','Application 4 ',
    'Application 5 '],
    'Assigned To': ['Jim Smith',np.nan,'John Williams',np.nan,np.nan,'Sarah Smith',
    np.nan,'Mark Meed'  ]}

df = pd.DataFrame(d)

  Primary Application    Assigned To
0      Application 1       Jim Smith
1      Application 1             NaN
2      Application 2   John Williams
3      Application 2             NaN
4      Application 3             NaN
5      Application 3     Sarah Smith
6      Application 4             NaN
7      Application 5       Mark Meed

df[df.groupby('Primary Application') \
   .transform(lambda x: (x.size==1) | (~pd.isna(x)))['Assigned To']]

  Primary Application    Assigned To
0      Application 1       Jim Smith
2      Application 2   John Williams
5      Application 3     Sarah Smith
6      Application 4             NaN
7      Application 5       Mark Meed