У меня есть 3 файла CSV. Каждый из них имеет первый столбец в виде (строковых) имен людей, в то время как все остальные столбцы в каждом кадре данных являются атрибутами этого человека.
Как я могу «объединить» все три CSV-документа, чтобы создать единый CSV-файл, в котором каждая строка имеет все атрибуты для каждого уникального значения имени строки человека?
join()
Функция панд специфицирует , что мне нужно мультииндексных, но я путать о том, что иерархическая схема индексации имеет отношение к созданию объединения на основе единого индекса.
df1.join([df2, df3], on=[df2_col1, df3_col1])
не сработало.Ответы:
Предполагаемый импорт:
Ответ Джона Галта - в основном
reduce
операция. Если бы у меня было больше, чем несколько фреймов данных, я бы поместил их в список, подобный этому (сгенерированный через списки, циклы или еще много чего):Предполагая, что у них есть какой-то общий столбец, как
name
в вашем примере, я бы сделал следующее:Таким образом, ваш код должен работать с любым количеством фреймов данных, которые вы хотите объединить.
Редактировать 1 августа 2016 года : для тех, кто использует Python 3:
reduce
был перемещен вfunctools
. Итак, чтобы использовать эту функцию, вам сначала нужно импортировать этот модуль:источник
reduce
было замененоfunctools.reduce
Soimport functools functools.reduce(.......)
name1
,name2
иname3
соответственно.n-1
вызовы функции слияния? Я полагаю, что в этом случае, когда число фреймов данных невелико, это не имеет значения, но мне интересно, есть ли более масштабируемое решение.df
s с многоиндексными столбцами (это было добавление 'on' как столбца, который работал для первого слияния, но последующие слияния не удавались), вместо этого я заставил его работать с:df = reduce(lambda left, right: left.join(right, how='outer', on='Date'), dfs)
Вы можете попробовать это, если у вас есть 3 кадра
в качестве альтернативы, как упомянуто cwharland
источник
df1.merge(df2,on='name').merge(df3,on='name')
name1
,name2
иname3
соответственноdf1.merge(df2,left_on='name1', right_on='name2').merge(df3,left_on='name1', right_on='name3').drop(columns=['name2', 'name3']).rename(columns={'name1':'name'})
Это идеальная ситуация для
join
методаjoin
Метод построен именно для таких ситуаций. Вы можете присоединиться к любому количеству DataFrames вместе с ним. Вызывающий DataFrame объединяется с индексом коллекции переданных DataFrame. Для работы с несколькими фреймами данных необходимо поместить соединительные столбцы в индекс.Код будет выглядеть примерно так:
С данными @ zero вы можете сделать это:
источник
pd.DataFrame().join(dfs, how="outer")
. Это может быть чище в некоторых ситуациях.pd.concat
приведет к более простой синтаксис:pd.concat([df.set_index('name') for df in dfs], axis=1, join='inner').reset_index()
.concat
также более универсален при работе с дублирующимися именами столбцов в нескольких dfs (join
не так хорош в этом), хотя вы можете выполнять с ним только внутренние или внешние объединения.dfs[0].join(dfs[1:])
должно быть отредактировано,dfs[0].join(dfs[1:], sort=False)
потому что иначеFutureWarning
всплывет. Спасибо за хороший пример.ValueError: Indexes have overlapping values
хотя, проверяя отдельные кадры данных в списке, они не имеют перекрывающихся значений.Это также можно сделать следующим образом для списка фреймов данных
df_list
:или если кадры данных находятся в объекте генератора (например, чтобы уменьшить потребление памяти):
источник
В
python
3.6.3 сpandas
0.22.0 вы также можете использоватьconcat
до тех пор, пока вы указали в качестве индекса столбцы, которые вы хотите использовать для присоединениягде
df1
,df2
иdf3
определяются как в ответ Джон Галт висточник
Для выполнения операций соединения не требуется мультииндекс . Нужно просто правильно установить столбец индекса для выполнения операций соединения (например, какая команда
df.set_index('Name')
)По
join
умолчанию операция выполняется над индексом. В вашем случае вам просто нужно указать, чтоName
столбец соответствует вашему индексу. Ниже приведен примерУчебное пособие может быть полезным.
источник
Вот метод для объединения словаря фреймов данных с синхронизацией имен столбцов со словарем. Также он заполняет пропущенные значения при необходимости:
Эта функция объединяет данные фреймов данных.
Хорошо, давайте создадим данные и протестируем это:
источник
Простое решение:
Если имена столбцов похожи:
Если имена столбцов разные:
источник
Есть другое решение из документации панд (которого я не вижу здесь),
используя
.append
ignore_index=True
Используются для игнорирования индекса приложенного dataframe, заменив его на следующий индекс доступен в исходных один.Если есть разные имена столбцов,
Nan
будут введены.источник
Три кадра данных
Давайте объединить эти кадры, используя вложенный pd.merge
Здесь мы идем, у нас есть объединенный фрейм данных.
Удачного анализа !!!
источник