python pandas объединяют кадры данных на обеих осях (объединяются во всех направлениях) - PullRequest
0 голосов
/ 25 февраля 2019

Извиняюсь, если это дубликат, я не знаю подходящего ключевого слова для проблемы, с которой я сталкиваюсь.Я читаю серию фреймов данных и пытаюсь объединить каждый из них в один большой фрейм данных.DFS - это данные временных рядов, и некоторые из них должны быть добавлены вертикально, а некоторые должны быть добавлены горизонтально.Их несколько тысяч, но этот пример отражает проблему.

Проблема в том, что я не могу найти функцию панд, которая может обрабатывать слияние в обоих направлениях без предварительного знания того, что читается.

import pandas as pd


df1 = pd.DataFrame({'GMT_date': ["01-01-2000","02-01-2000","03-01-2000","04-01-2000","05-01-2000"] ,
                   'LOWI_Precipitation_24_Hour_(mm)': [2.2, 0, 0.2, 0.4, 0]})

df2 = pd.DataFrame({'GMT_date': ["06-01-2000","07-01-2000","08-01-2000","09-01-2000","10-01-2000"] ,
                   'LOWI_Precipitation_24_Hour_(mm)': [0.1, 0.1, 3.1, 4.0, 0]})

df3 = pd.DataFrame({'GMT_date': ["06-01-2000","07-01-2000","08-01-2000","09-01-2000","10-01-2000"] ,
                   'TGPY_Precipitation_24_Hour_(mm)': [0.6, 0.7, 5.1, 1.0, 2.0]})  

df_list = [df1, df2, df3]

merged_df = pd.DataFrame()

for df in df_list:
    merged_df = merged_df.merge(df, how='outer', left_index=True, right_index=True)
print(merged_df)

GMT_date_x  LOWI_Precipitation_24_Hour_(mm)_x  GMT_date_y  LOWI_Precipitation_24_Hour_(mm)_y    GMT_date  TGPY_Precipitation_24_Hour_(mm)
0  01-01-2000                                2.2  06-01-2000                                0.1  06-01-2000                              0.6
1  02-01-2000                                0.0  07-01-2000                                0.1  07-01-2000                              0.7
2  03-01-2000                                0.2  08-01-2000                                3.1  08-01-2000                              5.1
3  04-01-2000                                0.4  09-01-2000                                4.0  09-01-2000                              1.0
4  05-01-2000                                0.0  10-01-2000                                0.0  10-01-2000                              2.0

Как видите, столбцам был выделен новый столбец для каждого df, я хотел, чтобы они были в одном столбце.Я также попробовал следующее слияние:

merged_df  = pd.concat([merged_df , df], sort=True)

, которое выдает:

     GMT_date  LOWI_Precipitation_24_Hour_(mm)  TGPY_Precipitation_24_Hour_(mm)
0  01-01-2000                              2.2                              NaN
1  02-01-2000                              0.0                              NaN
2  03-01-2000                              0.2                              NaN
3  04-01-2000                              0.4                              NaN
4  05-01-2000                              0.0                              NaN
0  06-01-2000                              0.1                              NaN
1  07-01-2000                              0.1                              NaN
2  08-01-2000                              3.1                              NaN
3  09-01-2000                              4.0                              NaN
4  10-01-2000                              0.0                              NaN
0  06-01-2000                              NaN                              0.6
1  07-01-2000                              NaN                              0.7
2  08-01-2000                              NaN                              5.1
3  09-01-2000                              NaN                              1.0
4  10-01-2000                              NaN                              2.0

Теперь даты находятся в одном столбце, который я хотел, но в столбце даты есть дубликаты.Я попытался:

merged_df = merged_df.join(df)

, который выдает ошибку:

ValueError: columns overlap but no suffix specified: Index(['GMT_date', 'LOWI_Precipitation_24_Hour_(mm)'], dtype='object')

Я также попытался установить индекс GMT_date:

for df in df_list:
    df = df.set_index('GMT_date')
    merged_df = pd.concat([merged_df, df], axis=1)
print(merged_df)

            LOWI_Precipitation_24_Hour_(mm)  LOWI_Precipitation_24_Hour_(mm)  TGPY_Precipitation_24_Hour_(mm)
01-01-2000                              2.2                              NaN                              NaN
02-01-2000                              0.0                              NaN                              NaN
03-01-2000                              0.2                              NaN                              NaN
04-01-2000                              0.4                              NaN                              NaN
05-01-2000                              0.0                              NaN                              NaN
06-01-2000                              NaN                              0.1                              0.6
07-01-2000                              NaN                              0.1                              0.7
08-01-2000                              NaN                              3.1                              5.1
09-01-2000                              NaN                              4.0                              1.0
10-01-2000                              NaN                              0.0                              2.0

Это разрешает датув один столбец, и нет повторяющихся дат, но теперь у меня есть данные разбиты на 2 столбца с одинаковым именем?

Мне не хватает простой функции или аргумента, который решает объединение в обоих направлениях в одной строке?

Я попытался посмотреть на: pd.merge_asof, но, похоже, он возвращает только даты, которые делятся между 2 dfs.

Надеюсь, есть простое исправление?Такое ощущение, что вместо 'how': {'left', 'right', 'external', 'inner'} мне нужна опция для 'all' в слиянии.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

У меня есть другое решение, после объединения всех фреймов данных объединить дубликаты столбцов с групповым

import pandas as pd
import numpy as np
df1 = pd.DataFrame({'GMT_date': ["01-01-2000", "02-01-2000", "03-01-2000", "04-01-2000", "05-01-2000"],
                    'LOWI_Precipitation_24_Hour_(mm)': [2.2, 0, 0.2, 0.4, 0]})

df2 = pd.DataFrame({'GMT_date': ["06-01-2000", "07-01-2000", "08-01-2000", "09-01-2000", "10-01-2000"],
                    'LOWI_Precipitation_24_Hour_(mm)': [0.1, 0.1, 3.1, 4.0, 0]})

df3 = pd.DataFrame({'GMT_date': ["06-01-2000", "07-01-2000", "08-01-2000", "09-01-2000", "10-01-2000"],
                    'TGPY_Precipitation_24_Hour_(mm)': [0.6, 0.7, 5.1, 1.0, 2.0]})

df_list = [df1, df2, df3]
merged_df = pd.DataFrame()

for df in df_list:
    df = df.set_index('GMT_date')

    merged_df = pd.concat([merged_df, df], axis=1)

merged_df = merged_df.groupby(level=0, axis=1).agg(np.max)

print(merged_df)

вывод:

            LOWI_Precipitation_24_Hour_(mm)  TGPY_Precipitation_24_Hour_(mm)
01-01-2000                              2.2                              NaN
02-01-2000                              0.0                              NaN
03-01-2000                              0.2                              NaN
04-01-2000                              0.4                              NaN
05-01-2000                              0.0                              NaN
06-01-2000                              0.1                              0.6
07-01-2000                              0.1                              0.7
08-01-2000                              3.1                              5.1
09-01-2000                              4.0                              1.0
10-01-2000                              0.0                              2.0

вы можете использовать

merged_df = merged_df.groupby(level=0, axis=1).agg(np.max if np.nan else sum) # if there is `Nan` then it will take `np.max` else take sum of values
0 голосов
/ 25 февраля 2019

сначала скомбинируйте все кадры данных с LOWI_Precipitation_24_Hour_ и скомпонуйте все df с TGPY_Precipitation_24_Hour_(mm), затем используйте слияние

df1 = pd.DataFrame({'GMT_date': ["01-01-2000", "02-01-2000", "03-01-2000", "04-01-2000", "05-01-2000"],
                    'LOWI_Precipitation_24_Hour_(mm)': [2.2, 0, 0.2, 0.4, 0]})

df2 = pd.DataFrame({'GMT_date': ["06-01-2000", "07-01-2000", "08-01-2000", "09-01-2000", "10-01-2000"],
                    'LOWI_Precipitation_24_Hour_(mm)': [0.1, 0.1, 3.1, 4.0, 0]})

df3 = pd.DataFrame({'GMT_date': ["06-01-2000", "07-01-2000", "08-01-2000", "09-01-2000", "10-01-2000"],
                    'TGPY_Precipitation_24_Hour_(mm)': [0.6, 0.7, 5.1, 1.0, 2.0]})
# merge_df = pd.DataFrame()

new_df = pd.concat([df1, df2])
print(new_df)
merge_df = pd.merge(new_df, df3, how='left')
print(merge_df)

output:

     GMT_date  LOWI_Precipitation_24_Hour_(mm)  TGPY_Precipitation_24_Hour_(mm)
0  01-01-2000                              2.2                              NaN
1  02-01-2000                              0.0                              NaN
2  03-01-2000                              0.2                              NaN
3  04-01-2000                              0.4                              NaN
4  05-01-2000                              0.0                              NaN
5  06-01-2000                              0.1                              0.6
6  07-01-2000                              0.1                              0.7
7  08-01-2000                              3.1                              5.1
8  09-01-2000                              4.0                              1.0
9  10-01-2000                              0.0                              2.0

например, у вас есть этот вид df

df1 = pd.DataFrame({'GMT_date': ["01-01-2000", "02-01-2000", "03-01-2000", "04-01-2000", "05-01-2000"],
                    'LOWI_Precipitation_24_Hour_(mm)': [2.2, 0, 0.2, 0.4, 0]})

df2 = pd.DataFrame({'GMT_date': ["06-01-2000", "07-01-2000", "08-01-2000", "09-01-2000", "10-01-2000"],
                    'LOWI_Precipitation_24_Hour_(mm)': [0.1, 0.1, 3.1, 4.0, 0]})

df3 = pd.DataFrame({'GMT_date': ["06-01-2000", "07-01-2000", "08-01-2000", "09-01-2000", "10-01-2000"],
                    'TGPY_Precipitation_24_Hour_(mm)': [0.6, 0.7, 5.1, 1.0, 2.0]})

df4 = pd.DataFrame({'GMT_date': ["01-01-2000", "02-01-2000", "03-01-2000", "04-01-2000", "05-01-2000"],
                    'TGPY_Precipitation_24_Hour_(mm)': [0.6, 0.7, 5.1, 1.0, 2.0]})
# merge_df = pd.DataFrame()
# df1.set_index('GMT_date')

new_df = pd.concat([df1, df2])
new_df2 = pd.concat([df3, df4])

print(new_df)
merge_df = pd.merge(new_df, new_df2, how='left')
print(merge_df)

вывод:

     GMT_date  LOWI_Precipitation_24_Hour_(mm)  TGPY_Precipitation_24_Hour_(mm)
0  01-01-2000                              2.2                              0.6
1  02-01-2000                              0.0                              0.7
2  03-01-2000                              0.2                              5.1
3  04-01-2000                              0.4                              1.0
4  05-01-2000                              0.0                              2.0
5  06-01-2000                              0.1                              0.6
6  07-01-2000                              0.1                              0.7
7  08-01-2000                              3.1                              5.1
8  09-01-2000                              4.0                              1.0
9  10-01-2000                              0.0                              2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...