熊猫:来自没有合并的匹配的列
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 of
与Branch
列中的某个字段匹配后返回的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
【讨论】:
以上是关于熊猫:来自没有合并的匹配的列的主要内容,如果未能解决你的问题,请参考以下文章