Я пытаюсь объединить два фрейма данных так, что в итоге у меня получается один с таким же количеством столбцов, но с увеличенным количеством строк.
import pandas as pd, numpy as np
data1 = [['date' , 'symbol', 'value'],
['1999-01-10', 'AAA', 101],
['1999-01-11', 'AAA', 201]]
I am trying to merge two dataframes such that i end up with one with same number of columns but row count should increase
import pandas as pd, numpy as np
data1 = [['date' , 'symbol', 'value'],
['1999-01-10', 'AAA', 101],
['1999-01-11', 'AAA', 201]]
data2 = [['date' , 'symbol', 'value'],
['1999-01-10', 'BBB', 101],
['1999-01-11', 'BBB', 201]]
df1 = pd.DataFrame(data1[1:], columns=data1[:1])
df2 = pd.DataFrame(data2[1:], columns=data2[:1])
df = df1.merge(df2, on = ['date', 'symbol'], how='outer')
Приведенный выше код выдает ошибку в строке слияния:
ValueError: The column label 'date' is not unique.
For a multi-index, the label must be a tuple with elements corresponding to each level.
Я знаю, что могу добиться того, чего ищу, с помощью pd.CONCAT в приведенном выше случае, но я хочу понять, почему здесь не удается слияние, учитывая, что составные ключи даты + символа различны/уникальны? Кроме того, я не понимаю часть о мультииндексе. в этих кадрах данных нет индекса, кроме «естественного».
Проблема в том, как вы создаете df1
/df2
:
df1 = pd.DataFrame(data1[1:], columns=data1[0]) # <-- columns should be list, not list of lists
df2 = pd.DataFrame(data2[1:], columns=data2[0]) # <-- detto
Затем:
df = df1.merge(df2, on=["date", "symbol"], how = "outer")
print(df)
Распечатки:
date symbol value_x value_y
0 1999-01-10 AAA 101.0 NaN
1 1999-01-10 BBB NaN 101.0
2 1999-01-11 AAA 201.0 NaN
3 1999-01-11 BBB NaN 201.0
@mike01010 Вот как работает pd.merge (если есть столбцы с похожими именами). Он добавляет суффиксы для двух фреймов данных (его можно настроить с помощью аргументов).
df = df1.merge(df2, on=["date", 'symbol', 'value'], how = "outer")
создаст столбец с одним значением.
Эта ошибка связана с тем, как вы создаете входные данные. Разрезая с помощью [:1]
, вы создаете MultiIndex.
Таким образом, имена столбцов на самом деле:
[('date',), ('symbol',), ('value',)]
Для этого потребуется merge
с:
df1.merge(df2, on = [('date',), ('symbol',)], how='outer')
Вам следует использовать:
df1 = pd.DataFrame(data1[1:], columns=data1[0])
df2 = pd.DataFrame(data2[1:], columns=data2[0])
Тогда слияние работает как положено:
df1.merge(df2, on = ['date', 'symbol'], how='outer')
date symbol value_x value_y
0 1999-01-10 AAA 101.0 NaN
1 1999-01-11 AAA 201.0 NaN
2 1999-01-10 BBB NaN 101.0
3 1999-01-11 BBB NaN 201.0
спасибо, я мог бы отметить два правильных ответа. но я уверен, что у меня будет еще много вопросов
спасибо! в приведенном выше случае, почему создаются новые столбцы (_x и _y), почему не просто один столбец «значение»)