[英]Fill NaNs of pandas.DataFrame based on condition over another column
[英]Fill pandas dataframe column based on duplication of another column
我有一个 dataframe ,其中包含国家/地区、员工 ID 和一列,用于标识该行是否是主行,以防员工 ID 在文件中出现多次。 正如您在此示例中看到的那样,主行列全部混乱(具有“是”或“否”接受范围之外的值):
Country ID Primary row
CZ 1 Yes
CZ 1 Yes
DK 3 No
DK 2 No
DK 2
CZ 4 Yes
CZ 4 Yes
CZ 4 No
SK 5 No
SK 5 No
SK 5 No
SK 6 01-01-90
SK 6
SK 7
SK 7
CZ 8 #
我需要一个解决方案来执行以下操作:
对于在文件中仅出现一次的 ID,“主行”值应始终设置为“是”
对于在文件中多次出现的 ID:
预期的 output 将是:
Country ID Primary row
CZ 1 Yes
CZ 1 No
DK 3 Yes
DK 2 No
DK 2 Yes
CZ 4 Yes
CZ 4 No
CZ 4 No
SK 5 Yes
SK 5 No
SK 5 No
SK 6 Yes
SK 6 No
SK 7 Yes
SK 7 No
CZ 8 Yes
实现这一结果的最佳方法是什么? 谢谢!
您应该使用带有 groupby.apply 的自定义groupby.apply
:
def fix(s):
s2 = s[s.eq('Yes')] # only "Yes"
s3 = s[s.ne('No')] # only "No"
if len(s2): # if "Yes" are available, pick one to keep
idx = s2.sample(n=1).index[0]
elif len(s3): # if no "Yes", pick a non-"No"
idx = s3.sample(n=1).index[0]
else: # else, we only have "No", pick one
idx = s.sample(n=1).index[0]
out = pd.Series('No', index=s.index)
out[idx] = 'Yes'
return out
df['Primary row 2'] = df.groupby(['Country', 'ID'])['Primary row'].apply(fix)
output:
Country ID Primary row Primary row 2
0 CZ 1 Yes Yes
1 CZ 1 Yes No
2 DK 3 No Yes
3 DK 2 No No
4 DK 2 None Yes
5 CZ 4 Yes Yes
6 CZ 4 Yes No
7 CZ 4 No No
8 SK 5 No No
9 SK 5 No Yes
10 SK 5 No No
11 SK 6 01-01-90 No
12 SK 6 None Yes
13 SK 7 None No
14 SK 7 None Yes
15 CZ 8 # Yes
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.