繁体   English   中英

根据另一列的重复填充 pandas dataframe 列

[英]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:

    • 如果所有主行都为空白,则 select 随机一个设置为“是”,其他设置为“否”。
    • 如果主行有多个“是”,select 随机一个保持为“是”,其他设置为“否”。
    • 如果主行全部为“否”,则 select 随机一个为“是”,其他保持“否”。
    • 如果其中一个主行为“否”,则将空白值填写为“是”,如果有其他空白,则将其他设置为“否”。

预期的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM