合并多个 DataFrames Pandas

新手上路,请多包涵

这可能被认为是 对各种方法的详尽解释的 重复,但是由于数据帧数量较多,我似乎无法在那里找到解决我的问题的方法。

我有 多个 数据框(超过 10 个),每个数据框在一列中不同 VARX 。这只是一个简单的快速示例:

 import pandas as pd

df1 = pd.DataFrame({'depth': [0.500000, 0.600000, 1.300000],
       'VAR1': [38.196202, 38.198002, 38.200001],
       'profile': ['profile_1', 'profile_1','profile_1']})

df2 = pd.DataFrame({'depth': [0.600000, 1.100000, 1.200000],
       'VAR2': [0.20440, 0.20442, 0.20446],
       'profile': ['profile_1', 'profile_1','profile_1']})

df3 = pd.DataFrame({'depth': [1.200000, 1.300000, 1.400000],
       'VAR3': [15.1880, 15.1820, 15.1820],
       'profile': ['profile_1', 'profile_1','profile_1']})

每个 df 对于相同的配置文件具有相同或不同的深度,因此

我需要创建一个新的 DataFrame 来合并所有单独的 DataFrame,其中操作的 关键列depthprofile ,以及每个配置文件的 所有 出现的深度值。

VARX 值因此应该是 NaN 其中没有该配置文件的该变量的深度测量。

因此,结果应该是一个新的压缩 DataFrame,所有 VARX 作为 depthprofile 的附加列,像这样:

 name_profile    depth   VAR1        VAR2        VAR3
profile_1   0.500000    38.196202   NaN         NaN
profile_1   0.600000    38.198002   0.20440     NaN
profile_1   1.100000    NaN         0.20442     NaN
profile_1   1.200000    NaN         0.20446     15.1880
profile_1   1.300000    38.200001   NaN         15.1820
profile_1   1.400000    NaN         NaN         15.1820

请注意,配置文件的实际数量要大得多。

有任何想法吗?

原文由 PEBKAC 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 744
2 个回答

考虑在每个数据帧上设置索引,然后使用 pd.concat 运行水平合并:

 dfs = [df.set_index(['profile', 'depth']) for df in [df1, df2, df3]]

print(pd.concat(dfs, axis=1).reset_index())
#      profile  depth       VAR1     VAR2    VAR3
# 0  profile_1    0.5  38.198002      NaN     NaN
# 1  profile_1    0.6  38.198002  0.20440     NaN
# 2  profile_1    1.1        NaN  0.20442     NaN
# 3  profile_1    1.2        NaN  0.20446  15.188
# 4  profile_1    1.3  38.200001      NaN  15.182
# 5  profile_1    1.4        NaN      NaN  15.182

原文由 Parfait 发布,翻译遵循 CC BY-SA 4.0 许可协议

一种简单的方法是结合使用 functools.partial / reduce

首先 partial 允许“冻结”函数参数和/或关键字的某些部分,从而生成具有简化签名的新对象。然后使用 reduce 我们可以将新的 部分对象 累积应用于可迭代项(此处为数据帧列表):

 from functools import partial, reduce

dfs = [df1, df2, df3]
merge = partial(pd.merge, on=['depth', 'profile'], how='outer')
reduce(merge, dfs)

   depth       VAR1    profile     VAR2    VAR3
0    0.6  38.198002  profile_1  0.20440     NaN
1    0.6  38.198002  profile_1  0.20440     NaN
2    1.3  38.200001  profile_1      NaN  15.182
3    1.1        NaN  profile_1  0.20442     NaN
4    1.2        NaN  profile_1  0.20446  15.188
5    1.4        NaN  profile_1      NaN  15.182

原文由 yatu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题