如果另一列中的值为空,我正在尝试从一行中删除重复项。这是一个示例数据框:
主要应用 | 分配给 |
---|---|
应用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 值,而不是那些与已经分配的值重复的值。
答案 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