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
接下来,我将执行以下操作:
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,我刚刚更正了它。