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

标签 python pandas dataframe

我希望在每个数据帧中的相同 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 来加入 df1 的 id 列(将有多个匹配的 ids ).当找到匹配的 id 时,存储在 df2['Tag'] 中的值应该附加到 df1 中的列,也许是一个数组。

我以迭代方式对此进行管理,但我的数据集相对较大,因此未发现它可行。

最佳答案

试试这个:

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

关于python - Pandas - 合并两个数据框,创建新列,将值附加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070329/

相关文章:

python - 如何使用 unittest 测试我的 flask 应用程序?

python - 转换 pandas.DataFrame 中的元组列表

python-3.x - 在 groupby 中应用 pandas cut

python - 为什么 SQLite Select 语句比 numpy.select 慢得多?有什么办法可以加快速度吗?

python - 如何创建滑动窗口并在 pandas 数据框中应用函数

r - 计算数据框中变量中多个字母的出现次数?

r - 使用 `car` 跨列范围重新编码

python - 如何创建同一类的多个对象,每个对象内部都有无限循环

python - Zappa 无服务器 aws lambda 问题

python - '' 中的未知列 'field list'。 Django