Слияние CSV-файлов с различными заголовками с Pandas в Python - PullRequest
6 голосов
/ 12 марта 2020

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

Я видел этот пример кода, но как мне это сделать? измените это, так как в этом примере для объединения данных используется общий заголовок.

a = pd.read_csv("a.csv")
b = pd.read_csv("b.csv")
#a.csv = ID TITLE
#b.csv = ID NAME
b = b.dropna(axis=1)
merged = a.merge(b, on='title')
merged.to_csv("output.csv", index=False)

Пример данных

a.csv (пустой формат файл, формат должен соответствовать этому файлу):

Headers: TOWN NAME LOCATION HEIGHT STAR

b.csv:

Headers: COUNTRY WEIGHT  NAME  AGE MEASUREMENT
 Data:    UK,     150lbs, John, 6,  6ft

Ожидаемый выходной файл:

Headers: TOWN    NAME   LOCATION  HEIGHT  STAR
Data:    (Blank) John,  UK,       6ft    (Blank)

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Из вашего примера похоже, что вам нужно переименовать столбец в дополнение к merge. Это проще всего сделать до самого merge.

# Read the csv files
dfA = pd.read_csv("a.csv")
dfB = pd.read_csv("b.csv")

# Rename the columns of b.csv that should match the ones in a.csv
dfB = dfB.rename(columns={'MEASUREMENT': 'HEIGHT', 'COUNTRY': 'LOCATION'})

# Merge on all common columns
df = pd.merge(dfA, dfB, on=list(set(dfA.columns) & set(dfB.columns)), how='outer')

# Only keep the columns that exists in a.csv
df = df[dfA.columns]

# Save to a new csv
df.to_csv("output.csv", index=False)

Это должно дать вам то, что вы ищете.

0 голосов
/ 12 марта 2020

Вот другой подход, использующий df.reindex для добавления пустых столбцов вместо merge.

import pandas as pd

dfa = pd.read_csv('./a.csv')
dfb = pd.read_csv('./b.csv')

# These columns will be renamed.
colmap = {'COUNTRY': 'LOCATION', 'MEASUREMENT': 'HEIGHT'}
# Extract all unique column names.
cols = list(set(dfa.columns.tolist() + dfb.columns.tolist()))
# Create a new dataset matching requirements.
dfb = dfb.rename(columns=colmap).reindex(columns=cols)[dfa.columns]
# Write to CSV.
dfb.to_csv('output.csv', index=False)

Вывод:

Содержимое CSV, как показано на консоли. .

(py35) user@host ~/Desktop/so
$ cat output.csv 

TOWN,NAME,LOCATION,HEIGHT,STAR
,John,UK,6ft

Исходные файлы:

Содержимое исходных CSV-файлов, отображаемых на консоли ...

(py35) user@host ~/Desktop/so
$ cat a.csv 

TOWN,NAME,LOCATION,HEIGHT,STAR

(py35) user@host ~/Desktop/so
$ cat b.csv 

COUNTRY,WEIGHT,NAME,AGE,MEASUREMENT
UK,150lbs,John,6,6ft
0 голосов
/ 12 марта 2020

Вы должны указать столбец left_on для кадра данных и столбец right_on для b данных. Таким образом, у вас есть общий тип данных с заголовком «data_1» на a и общие данные в b с заголовком «data_2». Если вы не создаете серию на этих фреймах данных, просто a ['series_1'] = [i для i в диапазоне (a.shape [0])] и для b ==> b ['series_1] = [i для я в диапазоне (b.shape [0]). Прямо сейчас у вас есть общий столбец. Если нет, вы можете использовать a.merge (b, left_on = 'a_column', right_on = 'b_column'), это сработает. Вы можете использовать reset_index () для общего столбца. Использование a = a.reset_index () создаст индекс от 1 до a.shape [0] и будет использовать его для b = b.reset_index (). Функция merge () автоматически распознает общие типы данных с одинаковыми заголовками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...