【问题标题】:Pandas - Merge two data frames, create new column, append values to arrayPandas - 合并两个数据框,创建新列,将值附加到数组
【发布时间】:2018-04-29 03:21:31
【问题描述】:

我希望在每个数据帧中合并同一 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 列(会有多个匹配的 id)。当找到匹配的id 时,存储在df2['Tag'] 中的值应该附加到df1 中的列,可能是一个数组。

我反复管理这个,但我的数据集相对较大,所以还没有发现它是可行的。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    试试这个:

    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 的回复 - 还有一件事,是否可以 groupby ID 并连接标签以显示频率。 IE。 ID: 1 和合并列 Merged_Tags: [One: 2, Two: 2]
    • @user3939059,不客气。不太清楚 - 你想在每一行中重复“计数”吗?您能否发布所需的数据集,或者更好地提出一个新问题?
    • 创建了一个新问题以使事情更清楚:stackoverflow.com/questions/39079415/…
    • @user3939059,好的,我有空的时候看看……
    【解决方案2】:
    >>> 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 2018-08-25
      • 1970-01-01
      • 2015-04-17
      • 2016-12-25
      • 1970-01-01
      相关资源
      最近更新 更多