在具有数据帧的字典列表上循环

2024-05-23 13:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,其中包含存储为字典的输入文件,这些字典表示导入的Excel文件。每个字典都有多个表存储为数据帧

当一列中出现三个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


Tags: 文件nameinforinputdictionary字典cell
2条回答

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

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

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

相关问题 更多 >