Python 在一个键列上合并多个数据帧(3+;)的细微差别
这里的第一个问题和一个很长的问题——关于合并和格式化我的数据帧,有几件事我正在努力解决。我有一些半途而废的解决方案,但我不确定它们是否是基于我想要的最好的解决方案 以下是我正在与pandas合并的数据帧的标准格式Python 在一个键列上合并多个数据帧(3+;)的细微差别,python,pandas,dataframe,merge,multi-index,Python,Pandas,Dataframe,Merge,Multi Index,这里的第一个问题和一个很长的问题——关于合并和格式化我的数据帧,有几件事我正在努力解决。我有一些半途而废的解决方案,但我不确定它们是否是基于我想要的最好的解决方案 以下是我正在与pandas合并的数据帧的标准格式 df1 = RT %Area RRT 0 4.83 5.257 0.509 1 6.76 0.424 0.712 2 7.27 0.495 0.766 3 7.70 0.257 0.811 4 7.79 0.122
df1 =
RT %Area RRT
0 4.83 5.257 0.509
1 6.76 0.424 0.712
2 7.27 0.495 0.766
3 7.70 0.257 0.811
4 7.79 0.122 0.821
5 9.49 92.763 1.000
6 11.40 0.681 1.201
df2=
RT %Area RRT
0 4.83 0.731 0.508
1 6.74 1.243 0.709
2 7.28 0.109 0.766
3 7.71 0.287 0.812
4 7.79 0.177 0.820
5 9.50 95.824 1.000
6 11.31 0.348 1.191
7 11.40 1.166 1.200
8 12.09 0.113 1.273
df3 = ...
目前,我正在对pd.merge\u ordered()
使用reduce操作来合并我的数据帧(3+)。这种方法产生了我想要的结果,这是前面一个问题()的结果。我正在RRT上进行合并,并希望具有相同RRT值的索引放在同一行上-如果该数据集的RRT值是唯一的,我希望其他数据集中缺失的数据为NaN
#The for loop I use to generate the list of formatted dataframes prior to merging
dfs = []
for entry in os.scandir(directory):
if (entry.path.endswith(".csv")) and entry.is_file():
entry = pd.read_csv(entry.path, header=None)
#Block of formatting code removed
dfs.append(entry.round(2))
dfs = [df1ar,df2ar,df3ar]
df_final = reduce(lambda left,right: pd.merge_ordered(left,right,on='RRT'), dfs)
cols = ['RRT', 'RT_x', '%Area_x', 'RT_y', '%Area_y', 'RT', '%Area']
df_final = df_final[cols]
print(df_final)
RRT RT_x %Area_x RT_y %Area_y RT %Area
0 0.508 NaN NaN 4.83 0.731 NaN NaN
1 0.509 4.83 5.257 NaN NaN 4.83 5.257
2 0.709 NaN NaN 6.74 1.243 NaN NaN
3 0.712 6.76 0.424 NaN NaN 6.76 0.424
4 0.766 7.27 0.495 7.28 0.109 7.27 0.495
5 0.811 7.70 0.257 NaN NaN 7.70 0.257
6 0.812 NaN NaN 7.71 0.287 NaN NaN
7 0.820 NaN NaN 7.79 0.177 NaN NaN
8 0.821 7.79 0.122 NaN NaN 7.79 0.122
9 1.000 9.49 92.763 9.50 95.824 9.49 92.763
10 1.191 NaN NaN 11.31 0.348 NaN NaN
11 1.200 NaN NaN 11.40 1.166 NaN NaN
12 1.201 11.40 0.681 NaN NaN 11.40 0.681
13 1.273 NaN NaN 12.09 0.113 NaN NaN
这是可行的,但是:
for
循环pd.merge\u asof()
进行类似的合并,并使用容差值根据RRT值之间的相似性微调合并?也就是说,是否可以在不切断较长数据帧数据的情况下进行合并?concat = pd.concat(dfs, axis=1, keys=['A','B','C'])
concat_final = concat.round(3)
print(concat_final)
A B C
RT %Area RRT RT %Area RRT RT %Area RRT
0 4.83 5.257 0.509 4.83 0.731 0.508 4.83 5.257 0.509
1 6.76 0.424 0.712 6.74 1.243 0.709 6.76 0.424 0.712
2 7.27 0.495 0.766 7.28 0.109 0.766 7.27 0.495 0.766
3 7.70 0.257 0.811 7.71 0.287 0.812 7.70 0.257 0.811
4 7.79 0.122 0.821 7.79 0.177 0.820 7.79 0.122 0.821
5 9.49 92.763 1.000 9.50 95.824 1.000 9.49 92.763 1.000
6 11.40 0.681 1.201 11.31 0.348 1.191 11.40 0.681 1.201
7 NaN NaN NaN 11.40 1.166 1.200 NaN NaN NaN
8 NaN NaN NaN 12.09 0.113 1.273 NaN NaN NaN
我也尝试过这个方法——我得到了多索引来表示它来自哪个文件(A、B、C,就像占位符一样)。但是,它显然没有像我想要的那样基于RRT值进行合并
pd.merge\u ordered()
格式类似的格式吗?groupby()
是否有效