熊猫:用列值匹配的列表填充新列
Posted
技术标签:
【中文标题】熊猫:用列值匹配的列表填充新列【英文标题】:Pandas: Populate new column with list from matches on column value 【发布时间】:2022-01-24 01:04:45 【问题描述】:我需要创建一个新列,用于在分隔列表中建立实体之间的关系(除逗号之外的任何分隔符都有效)。
数据框:
df1 = 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'])
最终结果应该是:
ID Name Branch Member of Members
==== ==== ====== ========= =======
1000 Jerry BR1 BR1 Jerry, Sal, Perry
1001 Sal BR2 BR1 Buck
1002 Buck BR3 BR2 NaN
1003 Perry BR4 BR1 NaN
我需要通过在“成员”中查找所有匹配项来创建“成员”列,但返回“名称”,然后填充以“成员”结尾的列表。
np.where 是个不错的起点吗?
np.where(df['Branch'] == df['Member of'], ??, np.nan)
【问题讨论】:
【参考方案1】:使用groupby
生成成员列表,然后使用merge
:
s = df1.groupby('Member of')['Name'].apply(list).rename('Members')
df2 = df1.merge(s, left_on='Branch', right_index=True, how='left')
输出:
ID Name Branch Member of Members
0 1000 Jerry BR1 BR1 [Jerry, Sal, Perry]
1 1001 Sal BR2 BR1 [Buck]
2 1002 Buck BR3 BR2 NaN
3 1003 Perry BR4 BR1 NaN
注意。如果您想要一个字符串而不是列表,请使用', '.join
代替list
【讨论】:
这当然有效。非常清楚,除了我试图破译right_index
位。
@EA 这只是告诉merge
使用s
的索引来执行匹配。在左/右合并中涉及的两个数据框或系列
@EA right_index
表示“使用 right 数据框的索引”(df1
在左侧,s
在右侧)。跨度>
【参考方案2】:
试试这个:
df1['Members'] = df1['Branch'].apply(lambda b: ', '.join(df1.loc[df1['Member of'] == b, 'Name'])).replace('', np.nan)
输出:
>>> df1
ID Name Branch Member of Members
0 1000 Jerry BR1 BR1 Jerry, Sal, Perry
1 1001 Sal BR2 BR1 Buck
2 1002 Buck BR3 BR2 NaN
3 1003 Perry BR4 BR1 NaN
【讨论】:
以上是关于熊猫:用列值匹配的列表填充新列的主要内容,如果未能解决你的问题,请参考以下文章
Hive查询:根据条件选择一列,另一列值匹配某些特定值,然后将匹配结果创建为新列
如何从单词列表中查找 DF 中的匹配单词并在新列中返回匹配的单词 [重复]