【问题标题】:Merge two data frames on multiple values在多个值上合并两个数据框
【发布时间】:2016-11-24 16:55:18
【问题描述】:

我有两个看起来像这样的数据框

df1

              name  ID      abb
     0         foo  251803  I
     1         bar  376811  R
     2         baz  174254  Q
     3      foofoo  337144  IRQ
     4      barbar  306521  IQ

df2

          abb    comment
     0      I       fine
     1      R     repeat
     2      Q      other

我正在尝试使用 pandas merge 加入两个数据帧,并通过以下方式将第二个数据帧中的 comment 列基于 abb 列分配给第一个数据帧:

df1.merge(df2, how='inner', on='abb')

导致:

              name  ID      abb  comment
     0         foo  251803  I       fine
     1         bar  376811  R     repeat
     2         baz  174254  Q      other

这适用于abb 中唯一的一个字母标识符。但是,对于不止一个角色,它显然失败了。

我尝试在第一个数据框中的abb 列上使用list,但这会导致KeyError

我想做的是以下。

1) 将该列中包含多个字符的行分成几行

2) 合并数据框

3) 可选:再次合并行

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用join:

    print (df1)
         name      ID  abb
    0     foo  251803    I
    1     bar  376811    R
    2     baz  174254    Q
    3  foofoo  337144  IRQ
    4  barbar  306521   IQ
    
    #each character to df, which is stacked to Series
    s = df1.abb.apply(lambda x: pd.Series(list(x)))
               .stack()
               .reset_index(drop=True, level=1)
               .rename('abb')
    print (s)
    0    I
    1    R
    2    Q
    3    I
    3    R
    3    Q
    4    I
    4    Q
    Name: abb, dtype: object
    
    df1 = df1.drop('abb', axis=1).join(s)
    print (df1)
         name      ID abb
    0     foo  251803   I
    1     bar  376811   R
    2     baz  174254   Q
    3  foofoo  337144   I
    3  foofoo  337144   R
    3  foofoo  337144   Q
    4  barbar  306521   I
    4  barbar  306521   Q
    

    【讨论】:

    • 列如我上面列出的那样。所以我不需要加入他们。但是,我不能在 'IRQ' 上使用 split 将字符串分成 'I'、'R' 和 'Q' 以使用堆栈来获取三列。
    • 非常有见地的答案。非常感谢。我已经确定了列表,但没有使用 apply ,这是这里的帽子戏法。
    【解决方案2】:

    查看answer 了解在列上爆炸的各种方法

    rows = []
    for i, row in df1.iterrows():
        for a in row.abb:
            rows.append([row['ID'], a, row['name']])
    
    df11 = pd.DataFrame(rows, columns=df1.columns)
    
    df11.merge(df2)
    

    【讨论】:

    • 查看您的原始答案,这可能比上述解决方案@piRSquared 稍快
    猜你喜欢
    • 2019-12-02
    • 2011-05-11
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多