Объединить несколько фреймов данных - PullRequest
4 голосов
/ 12 апреля 2019

Этот вопрос относится к предыдущему сообщению

Предложенные решения очень хорошо работали для меньшего набора данных, здесь я манипулирую 7 файлами .txt с общим объемом памяти 750 МБ. Который не должен быть слишком большим, поэтому я должен делать что-то не так в этом процессе.

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) - head:

  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 и т. Д.

Решение модифицировано согласно одному из ответов из предыдущего поста.

Цель - создать новый объединенный DataFrame со всеми VARX (каждого dfX) в качестве дополнительных столбцов для глубины, профиля и других 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 Ответ

1 голос
/ 12 апреля 2019

Рассмотрим снова использование горизонтальной конкатенации с pandas.concat. Поскольку у вас есть несколько строк, совместно использующих один и тот же профиль , глубина , год , месяц и день , добавьте текущий счетчик 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)
...