PEB*_*KAC 12 python dataframe 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']})
Run Code Online (Sandbox Code Playgroud)
每个df
轮廓都有相同或不同的深度,因此
我需要创建一个新的DataFrame,它将合并所有单独的DataFrame,其中操作的关键列是depth
和profile
,并且每个配置文件都显示所有深度值。
VARX
因此NaN
,该值应位于没有该轮廓的变量的深度测量的位置。
因此,结果应该是一个新的,压缩的DataFrame,其中的所有都VARX
作为depth
和profile
的附加列,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
请注意,配置文件的实际数量要大得多。
有任何想法吗?
Par*_*ait 10
考虑在每个数据帧上设置索引,然后使用以下命令运行水平合并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
Run Code Online (Sandbox Code Playgroud)
或使用merge
:
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
Run Code Online (Sandbox Code Playgroud)
更新资料
为了按照注释中的建议将数据框合并成一个循环,您可以执行以下操作:
df_final = pd.DataFrame(columns=df1.columns)
for df in dfs:
df_final = df_final.merge(df, on=['depth','profile'], how='outer')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3773 次 |
最近记录: |