У меня есть несколько CSV в папке, которую я читаю как фрейм данных, который в дальнейшем я зацикливаю в цикле for

df1=pd.DataFrame({"year":[2008,2008,2009,2008,2009],
            "product":["wood","paper","rocks","rocks","mint"],
            "cost":[200,300,90,78,300]})
df2=pd.DataFrame({"year":[2008,2008,2009,2008,2009],
            "product":["grass","wood","mint","sand","bottle"],
            "cost":[900,309,908,178,90]})

Я хочу создать фрейм данных с именем «summary_report», зацикливая эти фреймы данных, и сохранить в фрейме данных summary_report.

Игнорировать цвета

enter image description here

Ожидаемый отчет :

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

1
Amit 18 Ноя 2020 в 14:06

1 ответ

Лучший ответ

Используйте concat с новым столбцы для различения каждого DataFrame, затем перейдите к GroupBy.agg и последнее изменение формы с помощью DataFrame.stack и Series.unstack:

df = (pd.concat([df1.assign(g = 'df1'), df2.assign(g = 'df2')])
        .groupby(['g','year'])
        .agg(product_count=('product', 'size'),
             cost_total=('cost','sum'))
        .stack()
        .unstack([1,2]))
print (df)
year          2008                     2009           
     product_count cost_total product_count cost_total
g                                                     
df1              3        578             2        390
df2              3       1387             2        998

РЕДАКТИРОВАТЬ:

dfs = [pd.read_csv(file).assign(g = f'df{i}') 
       for i, file in enumerate(os.listdir(path), 1) if ".csv" in file]


df = (pd.concat(dfs)
        .groupby(['g','year'])
        .agg(product_count=('product', 'size'),
             cost_total=('cost','sum'))
        .stack()
        .unstack([1,2]))
2
jezrael 18 Ноя 2020 в 11:22