此问题是指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 :无法处理非唯一的多索引!
我在做什么错?
答案 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)