熊猫:来自没有合并的匹配的列

Posted

技术标签:

【中文标题】熊猫:来自没有合并的匹配的列【英文标题】: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( 部分,只使用列表。 【参考方案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

【讨论】:

以上是关于熊猫:来自没有合并的匹配的列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫在不同长度的列上合并两个数据框

熊猫合并如何避免未命名的列

合并熊猫数据框的列时出错

如何合并/组合熊猫中的列?

熊猫合并具有不同名称的列并避免重复[重复]

有没有办法在行和列索引上合并熊猫数据框?