首页 > 解决方案 > 如何保存不同文件中特定列的总和

问题描述

我已经编写了一个代码(感谢),它将我需要保持原样的列和目标列的总和分组:

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)

代码给了我想要的结果但是它只考虑了它迭代的最后一个文件,我需要保存来自不同文件的所有总和谢谢

标签: pythonexcelpandascsvglob

解决方案


只是你永远不会改变all_data循环,因为它永远不会重新分配。每个循环迭代都附加到在循环外初始化的空数据帧。所以只保留最后一个文件。快速(非推荐)修复包括:

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(...)

但是,请重新考虑在循环内增长数据框。正如@unutbu 警告我们的那样:永远不要在 for 循环中调用DataFrame.append或调用。pd.concat它导致二次复制。相反,推荐的版本是构建一个数据帧列表,以便在循环外连接一次,您可以使用列表理解来执行此操作,即使assign对于filename

# 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)

推荐阅读