如何加入 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】:
join
和 reindex
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时如何保留列MultiIndex值