合并多个数据框

时间:2019-04-12 16:41:29

标签: python pandas dataframe dask

此问题是指previous post

提出的解决方案对于较小的数据集非常有效,在这里,我要处理7个.txt文件,总内存为750 MB。不应太大,所以在此过程中我一定做错了。

df1  = pd.read_csv('Data1.txt', skiprows=0, delimiter=' ', usecols=[1,2, 5, 7, 8, 10, 12, 13, 14])
df2  = pd.read_csv('Data2.txt', skiprows=0, delimiter=' ', usecols=[1,2, 5, 7, 8, 10, 12, 13, 14])
df3  = ...
df4 = ...

这是我的一个数据框(df1)的样子-头:

  name_profile depth           VAR1  ...  year  month  day
0  profile_1   0.6           0.2044  ...  2012     11  26
1  profile_1   0.6           0.2044  ...  2012     11  26
2  profile_1   1.1           0.2044  ...  2012     11  26
3  profile_1   1.2           0.2044  ...  2012     11  26
4  profile_1   1.4           0.2044  ...  2012     11  26
...

还有尾巴:

       name_profile     depth              VAR1  ...  year  month  day
955281  profile_1300   194.600006          0.01460  ...  2015      3  20
955282  profile_1300   195.800003          0.01095  ...  2015      3  20
955283  profile_1300   196.899994          0.01095  ...  2015      3  20
955284  profile_1300   198.100006          0.00730  ...  2015      3  20
955285  profile_1300   199.199997          0.01825  ...  2015      3  20

我遵循了一个建议并删除了重复项:

df1.drop_duplicates()
...

类似地,df2具有VAR2,df3 VAR3等。

根据上一篇文章的答案之一修改了解决方案。

目标将创建一个(所有dfX的)所有所有VARX合并的新的 DataFrame,作为深度,纵断面和其他3个附加列的,所以我尝试了这样的事情:

dfs = [df.set_index(['depth','name_profile', 'year', 'month', 'day']) for df in [df1, df2, df3, df4, df5, df6, df7]]

df_merged = (pd.concat(dfs, axis=1).reset_index())

当前错误是:

ValueError :无法处理非唯一的多索引!

我在做什么错?

1 个答案:

答案 0 :(得分:1)

再次考虑将水平串联与pandas.concat一起使用。由于您有多个行共享相同的 profile 深度,将运行计数cumcount添加到使用groupby().cumcount()计算的多索引中:

grp_cols = ['depth', 'name_profile', 'year', 'month', 'day']

dfs = [(df.assign(grp_count = df.groupby(grp_cols).cumcount())
          .set_index(grp_cols + ['grp_count'])
       ) for df in [df1, df2, df3, df4, df5, df6, df7]]

df_merged = pd.concat(dfs, axis=1).reset_index()

print(df_merged)