【问题标题】:build a dataframe by reading the last row of 100s of csv files in a loop通过循环读取 100 多个 csv 文件的最后一行来构建数据框
【发布时间】:2022-12-11 17:48:33
【问题描述】:

我正在尝试通过读取 100 个 csv 文件并通过 .tail(1) 和 pd.concat() 保留每个 csv 的最后一行来构建数据框。当前结果是一个 df,其中包含每行数据的标题行。

我希望获得有关读取每个 csv 的最后一行并构建一个数据框的方法的指导,该数据框的标题行在顶部,然后只有数据行。

这是我当前的代码:

count = 0

with open('names.txt', 'r') as my_file: 
    newline_break = "" 
    for readline in my_file: 
        line_strip = readline.strip() 
        newline_break += line_strip 
        count +=1
        
        try:

            df = pd.read_csv('~/' + line_strip + '.csv', 
                             index_col=None,
                            )
            
            df2 = df.tail(1)
            
            df3 = pd.concat([df2])
            
            print(df3)
            
        except Exception as e: 
            exc_type, exc_obj, exc_tb = sys.exc_info()
            fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
            print(exc_type, fname, exc_tb.tb_lineno) 

.txt 文件是一个简单的名称列表,它为 df.read_csv 步骤选择 .csv 文件。

这是当前的输出:

Unnamed: 0 Date name field1 field2 field3 field4 field5 field6 field7 field8
532 532 2022-12-02 Jones 2.2 0.03 234 17.0 800 1.2 23.34 15.28
Unnamed: 0 Date name field1 field2 field3 field4 field5 field6 field7 field8
674 674 2022-12-02 Smith 3.81 4.08 3.75 3.99 16 2.832 3.97 4.05
Unnamed: 0 Date name field1 field2 field3 field4 field5 field6 field7 field8
674 674 2022-12-02 Grove 28.42 28.57 28.42 28.55 72 0.04 2.67 6.8
Unnamed: 0 Date name field1 field2 field3 field4 field5 field6 field7 field8
674 674 2022-12-02 Injo 3.09 3.16 3.08 3.1 462 0.94 2.93 2.90
Unnamed: 0 Date name field1 field2 field3 field4 field5 field6 field7 field8
674 674 2022-12-02 Solas 1.26 14.83 18.69 3.32 500 0.31 13.07 17.92
Unnamed: 0 Date name field1 field2 field3 field4 field5 field6 field7 field8
674 674 2022-12-02 Resto 1.84 1.04 1.04 3.77 100 0.1 9.9 7.7

这是所需的输出:

Date name field1 field2 field3 field4 field5 field6 field7 field8
2022-12-02 Jones 2.2 0.03 234 17.0 800 1.2 23.34 15.28
2022-12-02 Smith 3.81 4.08 3.75 3.99 16 2.832 3.97 4.05
2022-12-02 Grove 28.42 28.57 28.42 28.55 72 0.04 2.67 6.8
2022-12-02 Injo 3.09 3.16 3.08 3.1 462 0.94 2.93 2.90
2022-12-02 Solas 1.26 14.83 18.69 3.32 500 0.31 13.07 17.92
2022-12-02 Resto 1.84 1.04 1.04 3.77 100 0.1 9.9 7.7

*注意:删除额外的索引列也很好。 . . :-)

感谢您的指导。

【问题讨论】:

    标签: python pandas csv concatenation


    【解决方案1】:

    尝试通过在循环之前实例化一个空数据框来重构您的代码,并将每个新行与其连接起来,如下所示:

    count = 0
    
    with open("names.txt", "r") as my_file:
    
        df = pd.DataFrame()
    
        newline_break = ""
        for readline in my_file:
            line_strip = readline.strip()
            newline_break += line_strip
            count += 1
    
            try:
    
                df = pd.concat(
                    [
                        df,
                        pd.read_csv(
                            "~/" + line_strip + ".csv",
                            index_col=None,
                        )
                        .drop(columns=["Unnamed: 0"])
                        .tail(1),
                    ],
                )
    
            except Exception as e:
                exc_type, exc_obj, exc_tb = sys.exc_info()
                fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
                print(exc_type, fname, exc_tb.tb_lineno)
    

    在 with 语句之后和之外,设置一个新索引:

    df3 = df3.set_index("Date")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多