【问题标题】:Create "Yes" column according to another column value pandas dataframe根据另一个列值 pandas 数据框创建 \"Yes\" 列
【发布时间】:2023-01-04 21:17:43
【问题描述】:

想象一下,我有一个包含员工 ID、他们的合同编号和他们工作的公司的数据框。每个员工都可以为同一家公司甚至不同公司签订任意数量的合同:

ID  Contract Number Company
10000   1           Abc
10000   2           Zxc
10000   3           Abc
10001   1           Zxc
10002   2           Abc
10002   1           Cde
10002   3           Zxc

我需要找到一种方法来识别每个 ID 的合同号为“1”的公司,然后创建一个“主合同”列,如果合同与合同公司在同一家公司,则该列将设置为“是”在此数据帧上产生的数字 1:

ID  Contract Number Company Primary Compay
10000   1            Abc           Yes
10000   2            Zxc           No
10000   3            Abc           Yes
10001   1            Zxc           Yes
10002   2            Abc           No
10002   1            Cde           Yes
10002   3            Zxc           No

实现它的最佳方法是什么?

【问题讨论】:

  • 您可能希望使用布尔值 (True/False) 来存储此类信息,而不是使用字符串值二进制模式。

标签: python pandas dataframe multiple-columns


【解决方案1】:

您可以将 groupby.applyisinnumpy.where 一起使用:

df['Primary Company'] = np.where(
 df.groupby('ID', group_keys=False)
   .apply(lambda g: g['Company'].isin(g.loc[g['Contract Number'].eq(1), 'Company'])
         ),
 'Yes', 'No'
)

输出:

      ID  Contract Number Company Primary Company
0  10000                1     Abc             Yes
1  10000                2     Zxc              No
2  10000                3     Abc             Yes
3  10001                1     Zxc             Yes
4  10002                2     Abc              No
5  10002                1     Cde             Yes
6  10002                3     Zxc              No

如果您可以只使用布尔值 (True/False) 而不是 'Yes'/'No'

df['Primary Company'] = (
 df.groupby('ID', group_keys=False)
   .apply(lambda g: g['Company'].isin(g.loc[g['Contract Number'].eq(1), 'Company']))
)

【讨论】:

    【解决方案2】:

    我认为您只需要一个自定义函数并将其应用于一列,如下所示:

    x=pd.DataFrame({"A":[1,2,3]})
    
    def f(d):
      return "Yes" if d==1 else "No"
    
        
    x=x["A"].apply(f)
    print(x)
    

    输出:

    0    Yes
    1     No
    2     No
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      相关资源
      最近更新 更多