熊猫:用列值匹配的列表填充新列

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 中的匹配单词并在新列中返回匹配的单词 [重复]

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列

用值填充列(熊猫)

如何将每行列表中的元素与熊猫匹配