【问题标题】:Pandas: Column from Match without Merge熊猫:来自没有合并的匹配的列
【发布时间】:2022-01-24 02:56:36
【问题描述】:

我需要根据不同列中的匹配来填充列。

数据帧:

df = pd.DataFrame(np.array([[1000, 'Jerry', 'BR1','BR1'], 
                             [1001, 'Sal', 'BR2', 'BR1'], 
                             [1002, 'Buck', 'BR3', 'BR2'],
                             [1003, 'Perry','BR4','BR1']]),
                   columns=['ID', 'Name', 'Branch', 'Member of'])

我需要创建一个“老板”列。

  • boss 定义为将Member ofBranch 列中的某个字段匹配后返回的Name

我可以这样做:

df_bosses = df[['Name', 'Branch']].copy()
df_bosses.rename(columns={'Name':'Boss'},inplace=True)
df.merge(df_bosses, how="left", left_on="Member of", right_on="Branch")

这让我到达了我想去的地方——只需要重命名一列并删除另一列。

有没有更有效的方法?

【问题讨论】:

  • 题外话,但你为什么使用 NumPy 数组?它不会添加任何 AFAIK,它会生成整数列 object 而不是 int64,如果需要,您可以通过其他更清晰的方式来实现。
  • 是的,@EA 你可以完全省略np.array( 部分,只使用列表。

标签: python pandas


【解决方案1】:

试试这个:

df['Boss'] = df['Member of'].map(df.set_index('Branch')['Name'])

输出:

>>> df
     ID   Name Branch Member of   Boss
0  1000  Jerry    BR1       BR1  Jerry
1  1001    Sal    BR2       BR1  Jerry
2  1002   Buck    BR3       BR2    Sal
3  1003  Perry    BR4       BR1  Jerry

【讨论】:

  • 如果Member of 包含空白字符串或NaN 怎么办?
  • Member of 中不在 Branch 中的任何内容都将在 Boss 中显示为 NaN。这有意义吗?
【解决方案2】:

我会做replace

df['new'] = df['Member of'].replace(df.set_index('Branch')['Name'])
df
     ID   Name Branch Member of    new
0  1000  Jerry    BR1       BR1  Jerry
1  1001    Sal    BR2       BR1  Jerry
2  1002   Buck    BR3       BR2    Sal
3  1003  Perry    BR4       BR1  Jerry

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 2019-08-25
    • 2020-04-08
    • 1970-01-01
    • 2015-01-08
    • 2021-04-22
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多