Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的管道合并多个数据帧_Python_Pandas_Merge_Pipe - Fatal编程技术网

Python中的管道合并多个数据帧

Python中的管道合并多个数据帧,python,pandas,merge,pipe,Python,Pandas,Merge,Pipe,假设我生成了三个要合并的数据帧: 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.ran

假设我生成了三个要合并的数据帧:

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(其具有与z相同的第三列f)合并。即,请注意,“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编码,因此我喜欢pipe%>%操作符的框架

    最终输出为:

              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),因为我希望在处理完数据后离开join,例如在.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
    中的连接列,您可以在一个公共列名上进行连接,并避免以后必须删除它们。由于第一个
    merge
    操作返回一个
    DataFrame
    对象,您可以使用另一个
    merge
    操作在该对象的基础上进行构建。

    另一种方法,无需使用
    管道,可以说更具可读性:

    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
    中的联接列,您可以在一个公共列名上联接,并避免在以后删除它们。由于第一个
    merge
    操作返回一个
    DataFrame
    对象,您可以使用另一个
    merge
    操作来构建该对象。

    我建议您放置一些测试数据并在您问题中的预期输出。这将帮助我们更好地帮助您。请看感谢@ScottBoston,我刚刚更正了它。我建议您在问题中添加一些测试数据和预期输出。这将帮助我们更好地帮助您。请看感谢@ScottBoston,我刚刚更正了它。