使用DataFrames遍历字典列表

时间:2020-07-17 11:49:54

标签: python excel pandas dictionary

我有一个列表,其中输入文件存储为字典,代表导入的Excel文件。每个词典都有多个表存储为DataFrames。

当列中出现三个NaN值时,我想存储彼此附加的不同字典(Excel文件)的相同键(表单),同时破坏表单。我初始化了一个新字典,该字典应具有与字典(Excel文件)相同的键(页),但是现在所有数据都附加到此单个字典d_sheets

为此,我使用以下代码:

input_files = []
for file in read_input:
    input_file = pd.read_excel(io=file, sheet_name=needed_sheets, dtype=str)
    input_files.append(input_file)

d_sheets = {}
for dictionary in input_files:
      for sheet_name in sorted(dictionary):
            d_sheets[sheet_name] = pd.DataFrame()
            if sheet_name != 'Sheetname1':
                cell = dictionary[sheet_name]['Columnname1']
            else:
                cell = dictionary[sheet_name]['Columnname2']
            three_NaNs = cell.isna() & cell.shift(-1).isna() & cell.shift(-2).isna()
            first_instance = cell[three_NaNs].index.min()
            good_data = dictionary[sheet_name][cell.index <= first_instance]
            d_sheets[sheet_name].append(good_data)
            d_sheets[sheet_name] = pd.concat([d_sheets[sheet_name], good_data], axis=0)

对于单个字典(Excel文件)而言,布尔语句似乎起作用,并且密钥存储在d_sheets中。但是,我找不到在input_files中遍历字典的可行方法。

什么会导致我无法遍历列表input_files并将所有工作表存储在d_sheets中的问题?

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的“破表”策略(请谅解,请原谅我),这是一个可以完成此任务的脚本:

import pandas as pd

# helper function to break sheets with 3 consecutive NaN in any column
def df_breaker(df):
    res = pd.DataFrame()
    nan_ind = pd.DataFrame({k:[0] for k in df.columns})
    for row in df.iloc:
        nan_ind=(row.isna()*nan_ind)+row.isna()
        if (nan_ind.iloc[0]>=3).any():
            return res.iloc[:-2]
        res=res.append(row)
    return res

# shall be broken after second row
dfa = pd.DataFrame({'c1':[0,1,None,None,None],'c2':[5,6,7,8,9]})
# shall not be broken 
dfb = pd.DataFrame({'c1':[10,None,12,None,14],'c2':[None,16,None,18,19]})
# shall not be broken 
dfc = pd.DataFrame({'c1':[20,21,22,23,24],'c2':[25,26,27,28,29]})
# shall not be broken 
dfd = pd.DataFrame({'c1':[30,31,32,33,34],'c2':[35,36,37,38,39]})

input_files = [{'sheet1':dfa, 'sheet2':dfb},{'sheet1':dfc, 'sheet2':dfd}]


d_sheets ={}
for key in input_files[0]:
    d_sheets[key]=pd.concat([df_breaker(k[key]) for k in input_files])

答案 1 :(得分:0)

我已经解决了该问题,因为DataFrame初始化不应该位于d_sheets[sheet_name] = pd.DataFrame()的for循环内。这样,循环的每次迭代都会清除DataFrame,然后执行计算。最后,这将导致最新的Excel文件仅作为输出,而不是合并的所有文件。