【问题标题】:How to append a row to a dataframe with a bucle?如何将一行附加到带有 bucle 的数据框?
【发布时间】:2021-10-09 17:11:52
【问题描述】:

我编写了一个函数来转换 Excel 工作表并从每月数据中提取一行。 Mensually 我将在一个新的 Excel 表上获得数据。 我做了这个:

def bocapago(nombre):
  path='/content/drive/MyDrive/Fundacion Frontera Economica/Muni/python/inputs/BOCAS DE PAGO'
  filename = path + "/" + nombre.upper() + '.xlsx'

  input_cols=[0,1,2,3] # Columnas a importar
  df = pd.read_excel(filename,
                   header=0,
                   usecols = input_cols, 
                   index_col=False,
                   )
  
  df.columns = ['n_tasa','Fecha','Lugar','Importe']
  
  pd.to_datetime(df['Fecha'])
  df['Periodo'] = pd.DatetimeIndex(df['Fecha']).month
  df['Periodo'] = nombre
  df['Periodo'] = df['Periodo'].str[:3] + "-" + df['Periodo'].str[-4:]
  
  df = pd.pivot_table(df, values='Importe', index='Periodo', columns='Lugar', aggfunc='sum')
  df = df.assign(Total=df.sum(1))
  df = df.rename(columns={'Total':'TOTAL GENERAL'})
 
  df.head()
  return df 

这是读取进程表的功能。然后我将其作为第二步:

ENERO1 = bocapago('ENERO2021')
FEBRERO1 = bocapago('FEBRERO2021')
MARZO1 = bocapago('MARZO2021')
MAYO1 = bocapago('MAYO2021')

ingxboca = [ENERO1, FEBRERO1, MARZO1, MAYO1]

ingxboca = pd.concat(ingxboca)

ingxboca = ingxboca.merge(ingresos['TOTAL IACM'], how='left', on='Periodo')
ingxboca['DIFERENCIA'] = ingxboca['TOTAL IACM']-ingxboca['TOTAL GENERAL']

ingxboca.head()

在这种情况下,我使用另一个名为“ingresos”的数据框进行合并。 我的疑问是如何做一个 for 或 while bucle 来做第二步,所以我可以将所有这些都包含在名为“bocapago”的函数中或制作另一个函数,如“finishing”。

【问题讨论】:

    标签: python pandas dataframe append concatenation


    【解决方案1】:

    我会保留 bocapago 作为它自己的函数,就像你所做的那样,并让第二个函数调用它。它降低了单个函数的复杂性,并且将来更容易代码重用。如果我正确理解了您的问题,这可行吗?

    def new_function(file_list:list):
        ingxboca = pd.concat([bocapago(f) for f in file_list])
        ingxboca = ingxboca.merge(ingresos['TOTAL IACM'], how='left', on='Periodo')
        ingxboca['DIFERENCIA'] = ingxboca['TOTAL IACM']-ingxboca['TOTAL GENERAL']
    
    return ingxboca.head()
    

    我不确定这是否回答了这个问题。如果是这样,我想第一行中的列表理解做到了。请记住,您可以将 if 语句添加到列表理解中。您还可以传入一个字符串并使用 glob 之类的东西为您提供一个包含规则的文件列表。

    【讨论】:

    • 谢谢@m25。我试过把这个: def tabla(file_list:list): ingxboca = pd.concat([bocapago(f) for f in file_list]) ingxboca = ingxboca.merge(ingresos['TOTAL IACM'], how='left ', on='Periodo') ingxboca['DIFERENCIA'] = ingxboca['TOTAL IACM']-ingxboca['TOTAL GENERAL'] return ingxboca.head() 然后运行:file_list = [bocapago('ENERO2021') , bocapago('FEBRERO2021'), bocapago('MARZO2021')] tabla(file_list) 但我有一个错误。我认为你提出的建议是正确的,但我不知道如何运行它。
    • 文件列表 = ['ENERO2021','FEBRERO2021', ... ] 。换句话说,file_list 应该是字符串列表,而不是数据帧。 pd.concat([bocapago(f) for f in file_list]) 是充当 for 循环的列表推导。它对 file_list 中的每个项目运行 bocapago。结果是数据框列表。您上面所说的方法将运行 bocapago 2 次。
    【解决方案2】:

    谢谢@m25。我试过把这个:

    def tabla(file_list:list):
        ingxboca = pd.concat([bocapago(f) for f in file_list])
        ingxboca = ingxboca.merge(ingresos['TOTAL IACM'], how='left', on='Periodo')
        ingxboca['DIFERENCIA'] = ingxboca['TOTAL IACM']-ingxboca['TOTAL GENERAL']
        return ingxboca.head()
    

    然后运行这个:

    file_list = [bocapago('ENERO2021'), bocapago('FEBRERO2021'), bocapago('MARZO2021')]
    tabla(file_list)
    

    但我有一个上限错误。我认为您提出的建议是正确的,但我不知道如何运行它。 是的,我更喜欢定义第二个函数来运行第二步

    【讨论】:

    • 在 cmets 中回复我的回复
    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 2014-01-08
    • 2019-10-20
    • 2019-10-22
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多