Объединять кадры данных по столбцам в каталоге с общими столбцами - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь объединить несколько файлов .txt в каталог, специально объединенный в одном из общего столбца X, найденного в фреймах данных.

import pandas as pd

  df1 = pd.DataFrame({'X': ['X0', 'X1', 'X2', 'X3'],
       ...:                     'B': ['B0', 'B1', 'B2', 'B3'],
       ...:                     'C': ['C0', 'C1', 'C2', 'C3'],
       ...:                     'D': ['D0', 'D1', 'D2', 'D3']})


 df2 = pd.DataFrame({'X': ['X0', 'X1', 'X2', 'X3'],
   ...:                     'G': ['G0', 'G1', 'G2', 'G3'],
   ...:                     'H': ['H0', 'H1', 'H2', 'H3'],
   ...:                     'J': ['J0', 'J1', 'J2', 'J3']})

, следуя предыдущему этому сообщению Pandas Слияние 101 и это https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

Я пытался

data = pd.DataFrame()
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    df=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    data=pd.concat([data,df])

data_merge = pd.merge(data,on='X',how='inner')

, но я получил

Ошибка типа: слияние ( ) отсутствует 1 обязательный позиционный аргумент: 'right'

Как объединить два файла данных по общему столбцу X?

ожидаемый результат

enter image description here

Спасибо.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

concat достаточно, вам не нужно merge. Сделайте data = [], прочитайте файлы в кадрах данных, добавьте их к data и concat один раз:

data = []
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    df=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    data.append(df.set_index('X'))

data_merge = pd.concat(data, axis=1)

Это предполагает, что ваши столбцы X не содержат дубликаты во всех кадрах данных. В противном случае вам нужно выполнить итерацию merge внутри for l oop без concat, что-то вроде:

final_df = None
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    df=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    if final_df is not None:
        final_df = final_df.merge(df, on='X', how='outer')
    else: 
        final_df = df
1 голос
/ 06 февраля 2020

Вы не включаете правильный фрейм данных для слияния, так как вы предоставляете вызову слияния только один фрейм данных, когда ему нужны оба. Попробуйте: pd.merge(df1, df2, on="X")

Редактировать:

dataframe_list = []
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    data=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    dataframe_list.append(data)

data_merge = pd.merge(dataframe_list[0], dataframe_list[1], on='X',how='inner')

Редактировать 2, более двух фреймов данных:

dataframe_list = []
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    data=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    dataframe_list.append(data)

    if len(dataframe_list) ==2:
        data_merge = pd.merge(dataframe_list[0], dataframe_list[1], on='X')
        dataframe_list = [data_merge]
dataframe = dataframe_list[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...