如何加入 Pandas Dataframes 并多次保留左列?

Posted

技术标签:

【中文标题】如何加入 Pandas Dataframes 并多次保留左列?【英文标题】:How to join Pandas Dataframes with keeping the left column multiple times? 【发布时间】: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 的任何行。这可能吗?

【问题讨论】:

您希望发生的合并似乎没有模式。我认为添加更多细节会有所帮助。 【参考方案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

【讨论】:

以上是关于如何加入 Pandas Dataframes 并多次保留左列?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:在具有不同名称的字段上加入 DataFrames?

Pandas 通过两列左连接 DataFrames

合并pandas DataFrames时如何保留列MultiIndex值

如何通过选择特定时间间隔内的时间来索引 pandas DataFrames?

如何加入 DataFrames 的地图?斯卡拉火花

如何在Python Pandas中将MultiIndex Dataframes与权重合并?