python - 在Python中管道合并多个pandas数据帧

标签 python pandas merge pipe

假设我生成三个要合并的 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

接下来,我执行以下操作:

  1. 按列 a 和 z 合并 df1 和 df2(相同但名称不同)。因此,我无法执行 df.join。
  2. 将其通过管道传输到 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')

通过重命名 df2df3 中的联接列,您可以联接公共(public)列名称,并避免事后删除它们。由于第一个 merge 操作返回一个 DataFrame 对象,您可以在该对象的基础上使用另一个 merge 操作进行构建。

关于python - 在Python中管道合并多个pandas数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44435868/

相关文章:

python - 我应该如何在 Python 中打印特定时区的时间?

python - 如何将包含时间的列添加到 pandas 数据框(从 JSON 创建)?

python 正则表达式的行为不符合我的预期

python - 我们如何从配置文件(具有列名)的分隔符的基础上拆分列名

python - 如何根据列值从 DataFrame 中选择行?

python - 移动 pandas 数据框中的列会将数据设置为 NaN

python - Gstreamer 编辑服务。播放真实的视频文件。 GESAsset 元素(从 Python 翻译为 C)

jQuery : Merge column of table

python - 获取所有相关的 Django 模型对象

r - 多列条件合并