Импортируйте csv-файлы в pandas и объедините в один df (с неравным количеством уровней в столбце)

#pandas #merge #assign

Вопрос:

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

введите описание изображения здесь

Это слияние может быть выполнено следующим образом:

 new_df = df1.assign(index_count=df1.groupby('Step_ID').cumcount())
            .merge(df2.assign(index_count=df2.groupby('Step_ID').cumcount()),
                   on=['Step_ID', 'index_count'], how='outer')
            .sort_values(['Step_ID', 'index_count'])
            .drop('index_count', axis=1)

print(new_df)
 

Это отлично работает вручную, но я хотел бы прочитать все csv-файлы в папке и объединить их (с приведенным выше кодом) автоматически.

Чтобы добавить все CSV-файлы, я попробовал следующее:


Вот загрузка двух csv-файлов: https://github.com/pit9921/test

В случае, если read_csv загруженных файлов не работает, вот оба df, которые могут быть сохранены локально:

 import pandas as pd  
 
data = {'Step_ID': ["Step1", "Step1", "Step1", "Step2", "Step2", "Step3", "Step3"],    
        'value_01': [2, 2.3, 2.2, 0, 0, 5, 5.2]}  
df1 = pd.DataFrame(data) 
df1.to_csv('df1.csv', index=False)

data = {'Step_ID': ["Step1", "Step1", "Step1", "Step1", "Step2", "Step2", "Step2", "Step3", "Step3", "Step3"],    
        'value_02': [2.3, 2.5, 2.1, 2.5, 0, 0, 0, 5.1, 5.6, 5.8]}  
df2 = pd.DataFrame(data) 
df2.to_csv('df2.csv', index=False)
 

Ответ №1:

Вот решение от пользователя (я думаю, Генри Экера), который удалил свои сообщения. Извините за мой дилетантизм и большое вам спасибо.

 import pandas as pd
import glob

path = r'C:Usersxxx' 
all_files = glob.glob(path   "/*.csv")

dfs = []
for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    dfs.append(df.set_index(['Step_ID', df.groupby('Step_ID').cumcount()]))

merged = pd.concat(dfs, axis=1).droplevel(1).reset_index()