【问题标题】:Joining two DataFrames with Pandas, one with 1 row per key, and the other with several rows per key用 Pandas 连接两个 DataFrame,一个每个键有 1 行,另一个每个键有几行
【发布时间】:2022-01-10 18:08:34
【问题描述】:

首先,我想指出,我在 stackoverflow 和 pandas 文档中都没有找到我的问题的答案,所以,如果之前有人问过这个问题,我会很感激这个帖子的链接。

我想加入两个DataFrames如下。

df1 =

key   x   y   z
0    x0  y0  z0
1    x1  y1  z1
...
10  x10 y10 z10

df2 =

key w   v   u
0   w0  v0  u0
0   w0  v0  u0
0   w0  v0  u0
1   w1  v1  u1
1   w1  v1  u1
2   w2  v2  u2
3   w3  v3  u3
...
10  w10 v10 u10
10  w10 v10 u10

desired_df_output =

key  x   y   z   w   v   u
0   x0  y0  z0  w0  v0  u0
1   x1  y1  z1  w1  v1  u1
...
10 x10 y10 z10 w10 v10 u10

我试过这个df1.join(df2, how='inner', on='key'),但我得到这个错误:TypeError: object of type 'NoneType' has no len()

谢谢

【问题讨论】:

  • 在 DF2 中,元组 (w,v,u) 始终是 1 到 1 的键?我的意思是,如果我有两条键为 0 的记录,那么两条记录中 w、v 和 u 的值必然相同?
  • 是的,对于同一个键,它们总是相同的

标签: pandas join concatenation


【解决方案1】:

似乎df2 有重复值,所以如果你使用drop_duplicates 方法删除它们并从右侧与df1 合并,你会得到想要的结果。

out = df1.merge(df2.drop_duplicates(), on='key')

输出:

  key    x    y    z    w    v    u
0   0   x0   y0   z0   w0   v0   u0
1   1   x1   y1   z1   w1   v1   u1
2  10  x10  y10  z10  w10  v10  u10

【讨论】:

    【解决方案2】:
    import pandas as pd
    
    df1 = pd.DataFrame({'k':[0, 1, 2, 3],
                        'x':['x0', 'x1', 'x2', 'x3'],
                        'y':['y0', 'y1', 'y2', 'y3'],
                        'z':['z0', 'z1', 'z2', 'z3']
                       })
    df1.set_index('k', inplace=True)
    
    df2 = pd.DataFrame({'k':[0, 0, 0, 1, 1, 1],
                        'v':['v0', 'v0', 'v0','v1', 'v1', 'v1',],
                        'w':['w0', 'w0', 'w0','w1', 'w1', 'w1',],
                        'u':['u0', 'u0', 'u0','u1', 'u1', 'u1',]
                       })
    df2.set_index('k', inplace=True)
    
    df_merged = pd.merge(df1, df2.drop_duplicates(), how='inner', left_index=True, right_index=True)
    
    df_merged
    
    
        x   y   z   v   w   u
    k                       
    0   x0  y0  z0  v0  w0  u0
    1   x1  y1  z1  v1  w1  u1
    

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 2021-11-17
      • 1970-01-01
      相关资源
      最近更新 更多