Pandas объединяется, жалуясь на неуникальные метки, когда ключ является составным и уникальным

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

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 в приведенном выше случае, но я хочу понять, почему здесь не удается слияние, учитывая, что составные ключи даты + символа различны/уникальны? Кроме того, я не понимаю часть о мультииндексе. в этих кадрах данных нет индекса, кроме «естественного».

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, как вы создаете 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

спасибо! в приведенном выше случае, почему создаются новые столбцы (_x и _y), почему не просто один столбец «значение»)

mike01010 25.04.2024 22:53

@mike01010 Вот как работает pd.merge (если есть столбцы с похожими именами). Он добавляет суффиксы для двух фреймов данных (его можно настроить с помощью аргументов).

Andrej Kesely 25.04.2024 23:28
df = df1.merge(df2, on=["date", 'symbol', 'value'], how = "outer") создаст столбец с одним значением.
user19077881 25.04.2024 23:56

Эта ошибка связана с тем, как вы создаете входные данные. Разрезая с помощью [: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

спасибо, я мог бы отметить два правильных ответа. но я уверен, что у меня будет еще много вопросов

mike01010 25.04.2024 22:54

Другие вопросы по теме