Pandas - 合并两个数据框,创建新列,将值附加到数组

4

我想在两个数据框中相同的id上合并,但是创建一个新列并将指定列中的任何值附加到新数据框列中的数组中。我预计在第二个数据框中会看到多个匹配的id。

这里有一个例子来澄清我的需求:

import numpy as np
import pandas as pd

df1 = pd.DataFrame(np.random.randint(3, size=(5, 4)), columns=('ID', 'X1', 'X2', 'X3'))
print(df1)

   ID  X1  X2  X3
0   1   1   0   2
1   0   1   0   1
2   0   1   2   2
3   1   2   2   0
4   2   1   0   0

d = {'ID' : pd.Series([1, 2, 1, 4, 5]), 'Tag' : pd.Series(['One', 'Two', 'Two', 'Four', 'Five'])}
df2 = (pd.DataFrame(d))
print(df2)

   ID   Tag
0   1   One
1   2   Two
2   1   Two
3   4  Four
4   5  Five

这是我期望看到的首行内容:
   ID  X1  X2  X3  Merged_Tags
0   1   1   0   2  ['One', 'Two']

我希望能够通过查找df2中所有匹配的ids(可能有多个匹配的ids)来加入df1的id列。当找到匹配的id时,应将存储在df2 ['Tag']中的值附加到df1中的一列中,例如一个数组。
我曾经使用迭代的方式完成了这个任务,但是我的数据集相对较大,因此不可行。
2个回答

2

尝试这个:

In [35]: pd.merge(df1, df2.groupby('ID').Tag.apply(list).reset_index(), on='ID', how='left')
Out[35]:
   ID  X1  X2  X3         Tag
0   2   1   1   2       [Two]
1   1   0   1   1  [One, Two]
2   0   2   1   2         NaN
3   1   0   2   2  [One, Two]
4   0   0   2   2         NaN

或者你可以使用 map() 方法:

In [38]: df1['Merged_Tags'] = df1.ID.map(df2.groupby('ID').Tag.apply(list))

In [39]: df1
Out[39]:
   ID  X1  X2  X3 Merged_Tags
0   2   1   1   2       [Two]
1   1   0   1   1  [One, Two]
2   0   2   1   2         NaN
3   1   0   2   2  [One, Two]
4   0   0   2   2         NaN

感谢您的回复MaxU - 还有一件事,是否可以按ID进行groupby并将标签连接起来以显示频率。即 ID: 1 和合并列 Merged_Tags: [One: 2, Two: 2] - archienorman
@user3939059,欢迎。不太清楚 - 你想在每一行中重复“counts”吗?你能发布一个期望的数据集或者最好是开一个新问题吗? - MaxU - stand with Ukraine
创建了一个新问题以使事情更清晰:http://stackoverflow.com/questions/39079415/data-frame-group-id-create-value-count-dictionary - archienorman
@user3939059,好的,我有空的时候会看一下它... - MaxU - stand with Ukraine

1
>>> df1.join(df2.groupby('ID').Tag.apply(lambda group: list(group)), on='ID')

   ID  X1  X2  X3         Tag
0   1   1   0   2  [One, Two]
1   0   1   0   1         NaN
2   0   1   2   2         NaN
3   1   2   2   0  [One, Two]
4   2   1   0   0       [Two]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接