Как сохранить сумму указанных c столбцов из разных файлов - PullRequest
0 голосов
/ 30 января 2020

Я написал код (, спасибо ), который группирует столбец, который мне нужен, чтобы остаться как есть, и сумму целевых столбцов:

import pandas as pd
import glob as glob
import numpy as np

#Read excel and Create DF  
all_data = pd.DataFrame()
for f in glob.glob(r'C:\Users\Sarah\Desktop\IDPMosul\Data\2014\09\*.xlsx'):
    df = pd.read_excel(f,index_col=None, na_values=['NA'])
    df['filename'] = f
    data = all_data.append(df,ignore_index=True)

#Group and Sum
result = data.groupby(["Date"])["Families","Individuals"].agg([np.sum])

#Save file
file_name = r'C:\Users\Sarah\Desktop\U2014.csv'
result.to_csv(file_name, index=True)

проблема здесь :

 #Save file
 file_name = r'C:\Users\Sarah\Desktop\U2014.csv'
 result.to_csv(file_name, index=True)

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

1 Ответ

1 голос
/ 30 января 2020

Просто вы никогда не измените all_data в l oop, так как оно никогда не переустанавливается. Каждая итерация l oop добавляется к пустому фрейму данных, инициализированному вне l oop. Таким образом, сохраняется только самый последний файл. Быстрое (не рекомендуемое) исправление будет включать:

all_data = pd.DataFrame()
for f in glob.glob(r'C:\Users\Sarah\Desktop\IDPMosul\Data\2014\09\*.xlsx'):
   ...
   all_data = all_data.append(df, ignore_index=True)    # CHANGE LAST LINE IN LOOP

# USE all_data (NOT data) aggregation
result = all_data.groupby(...)

Однако, пересмотрите возможность увеличения фрейма данных внутри al oop. @Unutbu предупреждает нас: Никогда не звоните DataFrame.append или pd.concat в течение -1 oop. Это приводит к квадратичному c копированию. Вместо этого, рекомендуемой версией будет создание списка фреймов данных для конкатенации один раз вне l oop, что можно сделать с помощью понимания списка даже assign для имя файла :

# BUILD LIST OF DFs  
df_list = [(pd.read_excel(f, index_col=None, na_values=['NA']) 
              .assign(filename = f)
           ) for f in glob.glob(r'C:\Users\Sarah\Desktop\IDPMosul\Data\2014\09\*.xlsx')]

# CONCATENATE ALL DFs
data = pd.concat(df_list, ignore_index=True)

# AGGREGATE DATA
result = data.groupby(["Date"])["Families", "Individuals"].agg([np.sum])

file_name = r'C:\Users\Sarah\Desktop\U2014.csv'
result.to_csv(file_name, index=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...