【问题标题】:How to join Pandas Dataframes with keeping the left column multiple times?如何加入 Pandas Dataframes 并多次保留左列?
【发布时间】:2018-10-19 19:41:36
【问题描述】:

我想做以下加入:

    A   B
0   a   z
1   b   y
2   c   x

    A   C   D
0   a   1   xy
1   b   1   xc
2   a   2   xv
3   c   2   xb

    A   B   C   D
0   a   z   1   xy
1   b   y   1   xc
2   c   x   1   NaN
3   a   z   2   xv
4   b   y   2   NaN
5   c   x   2   xb

因此,对于“C”中的每个值,我都想将整个第一个 Dataframe 加入到第二个 Dataframe 中,而不会丢失第一个 Frame 的任何行。这可能吗?

【问题讨论】:

  • 您希望发生的合并似乎没有模式。我认为添加更多细节会有所帮助。

标签: python pandas join merge left-join


【解决方案1】:

joinreindex

d = d2.set_index(['A', 'C'])
d = d.reindex(pd.MultiIndex.from_product(d.index.levels, names=d.index.names))
d.join(d1.set_index('A')).reset_index().sort_index(1)

   A  B  C    D
0  a  z  1   xy
1  a  z  2   xv
2  b  y  1   xc
3  b  y  2  NaN
4  c  x  1  NaN
5  c  x  2   xb

重新排列一些东西以完全匹配 OP

d = d2.set_index(['C', 'A'])
d = d.reindex(pd.MultiIndex.from_product(d.index.levels, names=d.index.names))
d.join(d1.set_index('A')).sort_index().reset_index().sort_index(1)

   A  B  C    D
0  a  z  1   xy
1  b  y  1   xc
2  c  x  1  NaN
3  a  z  2   xv
4  b  y  2  NaN
5  c  x  2   xb

巧妙使用pd.concat

pd.concat(d.merge(d1.assign(C=i), 'outer') for i, d in d2.groupby('C'))

   A  B  C    D
0  a  z  1   xy
1  b  y  1   xc
4  c  x  1  NaN
2  a  z  2   xv
5  b  y  2  NaN
3  c  x  2   xb

【讨论】:

    【解决方案2】:

    这会涉及到groupby + merge,我不能保证速度

    df2.groupby('C').apply(lambda x : x.merge(df1,on='A',how='outer').assign(C=lambda d: d['C'].ffill())).reset_index(drop=True)                       
    Out[954]: 
       A    C    D  B
    0  a  1.0   xy  z
    1  b  1.0   xc  y
    2  c  1.0  NaN  x
    3  a  2.0   xv  z
    4  c  2.0   xb  x
    5  b  2.0  NaN  y
    

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 2020-09-04
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多