假设我生成三个要合并的 pandas 数据框:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(10, 2),
columns=['a', 'b'])
df2 = df1.assign(b= np.random.randn(10)).rename(columns={'a': 'z', 'b': 'd'})
df3 = df2.assign(d= np.random.randn(10)).rename(columns={'z': 'f', 'd': 'e'})
这会产生以下三个数据帧:
df1:
a b
0 1.919799 1.067477
1 0.719339 1.695729
2 -0.957719 0.967126
3 0.071723 -0.171463
4 -1.168568 0.193577
5 1.422793 0.947829
6 1.491163 -1.053055
7 -0.453266 0.151310
8 0.265600 0.579668
9 -0.379263 -0.971077
df2:
z d
0 1.919799 -1.026633
1 0.719339 -0.032280
2 -0.957719 -1.005391
3 0.071723 -1.279660
4 -1.168568 -0.342792
5 1.422793 0.265616
6 1.491163 0.110747
7 -0.453266 0.324986
8 0.265600 -1.557793
9 -0.379263 0.950179
df3:
f e
0 1.919799 2.440809
1 0.719339 -0.281359
2 -0.957719 0.278984
3 0.071723 -0.509653
4 -1.168568 -2.663583
5 1.422793 0.410250
6 1.491163 1.532236
7 -0.453266 -0.043323
8 0.265600 -1.078704
9 -0.379263 -0.569662
接下来,我执行以下操作:
- 按列 a 和 z 合并 df1 和 df2(相同但名称不同)。因此,我无法执行 df.join。
- 将其通过管道传输到 lambda 函数中,该函数将来自点 1 的组合 df1 和 df2 与 df3 合并(其中第三列 f 与 z 相同。即,请注意“a”、“z”和“f”) ' 是相同的变量。
我的合并操作代码如下:
df4 = pd.merge(df1, df2, left_on=['a'], right_on=['z'], how='left')\
.pipe(lambda df_: pd.merge(df_, df3, left_on=['z'], right_on=['f'], how='left'))\
.drop(['z', 'f'], axis=1)
因此,我的问题是,这是否是合并这三个数据帧的最佳方法。
我的主要目标是避免使用多行代码,而是使用管道运算符,以便我可以继续操作 df4,但如果存在其他可能性,请告诉我!
我习惯用 R 进行编码,因此我喜欢管道 %>% 运算符的框架。
最终输出为:
a b d e
0 1.919799 1.067477 -1.026633 2.440809
1 0.719339 1.695729 -0.032280 -0.281359
2 -0.957719 0.967126 -1.005391 0.278984
3 0.071723 -0.171463 -1.279660 -0.509653
4 -1.168568 0.193577 -0.342792 -2.663583
5 1.422793 0.947829 0.265616 0.410250
6 1.491163 -1.053055 0.110747 1.532236
7 -0.453266 0.151310 0.324986 -0.043323
8 0.265600 0.579668 -1.557793 -1.078704
9 -0.379263 -0.971077 0.950179 -0.569662
更新: 感谢您的回复。
也许我原来的问题不够清楚。
我主要对避免使用 pd 感兴趣。命令(例如 pd.concat),因为我想在完成数据操作后离开连接,例如在 .assign 之后。这就是使用 .pipe 运算符的原因。
在这方面,我无法使用 df3.join 操作,因为两个相同的列有不同的名称。此外,如果我希望能够使用 .join 进行多索引合并,则会收到以下错误:
NotImplementedError: merging with both multi-indexes is not implemented
希望能够澄清问题。
最佳答案
另一种选择,不使用.pipe
,并且可以说更具可读性:
df4 = df1.merge(df2.rename_axis({'z':'a'}, axis=1),
on='a',
how='left').merge(df3.rename_axis({'f':'a'}, axis=1),
on='a',
how='left')
通过重命名 df2
和 df3
中的联接列,您可以联接公共(public)列名称,并避免事后删除它们。由于第一个 merge
操作返回一个 DataFrame
对象,您可以在该对象的基础上使用另一个 merge
操作进行构建。
关于python - 在Python中管道合并多个pandas数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44435868/