【问题标题】:How can I simplify my pandas script using a loop?如何使用循环简化我的熊猫脚本?
【发布时间】:2022-08-21 11:39:14
【问题描述】:

我有以下代码:

import pandas as pd

df22=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table22.xlsx\")

#Select the sheets that are to be transformed
df3=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table3.xlsx\")
df4=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table4.xlsx\")
df5=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table5.xlsx\")
df6=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table6.xlsx\")
df7=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table7.xlsx\")
df8=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table8.xlsx\")
df9=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table9.xlsx\")
df10=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table10.xlsx\")
df11=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table11.xlsx\")
df12=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table12.xlsx\")
df13=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table13.xlsx\")
df14=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table14.xlsx\")
df15=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table15.xlsx\")
df16=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table16.xlsx\")
df17=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table17.xlsx\")
df18=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table18.xlsx\")
df19=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table19.xlsx\")
df20=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table20.xlsx\")
df21=pd.read_excel(r\"C:\\Users\\H\\Desktop\\Files\\Table21.xlsx\")

df=pd.concat([df22,df3,df4,df5,df6,df7,df8,df9,df10,df11,df12,df13,df14,df15,df16,df17,df18,df19,df20,df21], join=\'inner\')

df.to_excel(r\'C:\\Users\\H\\Desktop\\Files\\Allweeks.xlsx\', sheet_name=\'sheet1\', index = False) 

它将第 22.xlsx 周附加到 3 到 21 之间的所有周。我试图找出是否有人知道如何改进这个脚本。我试图使用循环,但我无法让它工作。

    标签: python excel pandas dataframe concatenation


    【解决方案1】:

    使用列表理解:

    df22=pd.read_excel(r"C:\Users\H\Desktop\Files\Table22.xlsx")
    dfs = [pd.read_excel(rf"C:\Users\H\Desktop\Files\Table{x}.xlsx") for x in range(3, 22)]
    df=pd.concat([df22] + dfs, join='inner')
    
    df.to_excel(r'C:\Users\H\Desktop\Files\Allweeks.xlsx', sheet_name='sheet1', index = False)
    

    或者创建所有数据帧的列表,然后将最后一个数据帧附加到列表中,如下所示:

    dfs = [pd.read_excel(rf"C:\Users\H\Desktop\Files\Table{x}.xlsx") for x in range(3, 23)]
    df=pd.concat(dfs[-1:] + dfs[:-1], join='inner')
    #another idea is swap order - 22, 21, 20 ... 3
    #df=pd.concat(dfs[::-1], join='inner')
    
    df.to_excel(r'C:\Users\H\Desktop\Files\Allweeks.xlsx', sheet_name='sheet1', index = False)
    

    【讨论】:

    • 愿意解释dfs[-1:] + dfs[:-1] 部分吗?还是您的意思是dfs[-1] + dfs[:-1](没有第一个:)?
    • 谢谢,我现在尝试使用代码。 rf 指的是什么?
    • @matszwecja - 我也需要第一个值的列表,所以使用-1:,检查与L = [4,5,8,7,9] print (L[-1], L[-1:], L[:-1]) 的差异
    • @BusyBee - 它是 r 像 raw 和 ff-strings 的组合
    • @jezrael 原始,而不是正则表达式
    【解决方案2】:

    例如,您可以使用 for 循环从 Table3 读取文件到 Table21,并将每个数据帧与 Table22 连接起来

    import pandas as pd
    
    df22 = pd.read_excel(r'C:\Users\H\Desktop\Files\Table22.xlsx')
    for i in range(3, 22):
        df22 = pd.concat([df22, pd.read_excel(r'C:\Users\H\Desktop\Files\Table' + str(i) + '.xlsx')])
    
    df22.to_excel(r'C:\Users\H\Desktop\Files\Allweeks.xlsx', sheet_name='sheet1', index=False) 
    #df22.to_excel('C:\\Users\\H\\Desktop\\Files\\Allweeks.xlsx', sheet_name='sheet1', index=False) 
    

    请注意,整数i 必须在文件路径中转换为字符串str(i)

    【讨论】:

    • 我只需要在路径之前包含一个 r ,否则我会收到错误消息。感谢您提供替代解决方案。
    • 哦,是的,我很粗心,没有原始字符串就需要双反斜杠`\`
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2013-10-03
    • 2020-10-02
    • 2016-03-31
    • 1970-01-01
    • 2023-03-17
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多