【问题标题】:How to append new dataframe rows to a csv using pandas?如何使用 pandas 将新的数据帧行附加到 csv?
【发布时间】:2018-04-14 01:28:11
【问题描述】:

我有一个新的数据框,如何将它附加到现有的 csv?

我尝试了以下代码:

f = open('test.csv', 'w')
df.to_csv(f, sep='\t')
f.close()

但它不会向 test.csv 附加任何内容。 csv很大,我只想使用append,而不是将整个csv作为数据帧读取并将其连接并写入新的csv。有什么好的方法可以解决问题吗?谢谢。

【问题讨论】:

    标签: pandas csv dataframe append


    【解决方案1】:

    试试这个:

    df.to_csv('test.csv', sep='\t', header=None, mode='a')
    # NOTE:                              ----->  ^^^^^^^^   
    

    【讨论】:

    • @HavenShi,很高兴它有帮助:)
    • 似乎每一行都变成了一个单元格,比如我的前一行是 AAA sunday 200,将其附加到 csv 后,只有一个单元格将所有内容组合在一起,如 'AAAsunday200' ,如何解决?
    • @HavenShi,我无法重现此行为。你能提供一个小的可重复数据集吗?
    • 当然。尝试以下代码,它将在您的本地文件夹中生成一个旧文件(10 行)和一个新文件(2 行)。我追加后,新的内容都混在一起了:
    • @HavenShi,你为什么使用不同的分隔符?首先使用默认的, 分隔符保存文件,然后使用\t 添加新条目
    【解决方案2】:

    TL:DR MaxU 的回答是正确的。

    df.to_csv('old_file.csv', header=None, mode='a')
    

    我有同样的问题,希望追加到 DataFrame 并保存到循环内的 CSV。这似乎是一种常见的模式。 我的标准是:

    1. 回写到同一个文件
    2. 不要写入不必要的数据。
    3. 在循环期间不断将新数据附加到数据帧。
    4. 保存每次迭代(以防长时间运行的循环崩溃)
    5. 不要将索引存储在 CSV 文件中。

    注意modeheader 的不同值。在完整的写入中,mode='w' 和 header=True,但在追加中,mode='a' 和 header='False'。

    import pandas as pd
    
    # Create a CSV test file with 3 rows
    data = [['tom', 10], ['nick', 15], ['juli', 14]] 
    test_df = pd.DataFrame(data, columns = ['Name', 'Age']) 
    test_df.to_csv('test.csv', mode='w', header=True, index=False)
    
    # Read CSV into a new frame
    df = pd.read_csv('test.csv')
    print(df)
    
    # MAIN LOOP
    # Create new data in a new DataFrame
    for i in range(0, 2):
        newdata = [['jack', i], ['jill', i]] 
        new_df  = pd.DataFrame(newdata, columns = ['Name', 'Age']) 
    
        # Write the new data to the CSV file in append mode
        new_df.to_csv('test.csv', mode='a', header=False, index=False)
        print('check test.csv')
    
        # Combine the new data into the frame ready for the next loop.
        test_df = pd.concat([test_df, new_df], ignore_index=True)
    
    # At completion, it shouldn't be necessary, but to write the complete data 
    test_df.to_csv('completed.csv', mode='w', header=True, index=False)
    # completed.csv and test.csv should be identical.
    

    【讨论】:

    • 谢谢。我来这里是为了寻找一种仅从迭代中附加新数据的方法,但没有意识到我可以使用我正在创建的 Series 或 DF 元素来做到这一点。
    【解决方案3】:

    尝试以下代码,它将在您的本地文件夹中生成一个旧文件(10 行)和一个新文件(2 行)。我追加后,新的内容都混在一起了:

    import pandas as pd
    import os 
    
    dir_path = os.path.dirname(os.path.realpath("__file__"))
    print(dir_path)
    
    raw_data = {'HOUR': [4, 9, 12, 7, 3, 15, 2, 16, 3, 21], 
            'LOCATION': ['CA', 'HI', 'CA', 'IN', 'MA', 'OH', 'OH', 'MN', 'NV', 'NJ'], 
            'TYPE': ['OLD', 'OLD', 'OLD', 'OLD', 'OLD', 'OLD', 'OLD', 'OLD', 'OLD', 'OLD'], 
            'PRICE': [4, 24, 31, 2, 3, 25, 94, 57, 62, 70]}
    old_file = pd.DataFrame(raw_data, columns = ['HOUR', 'LOCATION', 'TYPE', 'PRICE'])
    old_file.to_csv(dir_path+"/old_file.csv",index=False)
    
    
    raw_data = {'HOUR': [2, 22], 
            'LOCATION': ['CA', 'MN'], 
            'TYPE': ['NEW', 'NEW'], 
            'PRICE': [80, 90]}
    new_file = pd.DataFrame(raw_data, columns = ['HOUR', 'LOCATION', 'TYPE', 'PRICE'])
    new_file.to_csv(dir_path+"/new_file.csv",index=False)
    
    
    new_file=dir_path+"/new_file.csv"
    df=pd.read_csv(new_file)
    df.to_csv('old_file.csv', sep='\t', header=None, mode='a')
    

    它会变成:

    HOUR    LOCATION    TYPE    PRICE
    4   CA  OLD 4
    9   HI  OLD 24
    12  CA  OLD 31
    7   IN  OLD 2
    3   MA  OLD 3
    15  OH  OLD 25
    2   OH  OLD 94
    16  MN  OLD 57
    3   NV  OLD 62
    21  NJ  OLD 70
    02CANEW80           
    122MNNEW90  
    

    【讨论】:

    • df.to_csv('old_file.csv', header=None, mode='a') 应该可以解决问题
    【解决方案4】:

    要将 pandas 数据框附加到 csv 文件中,您也可以尝试一下。

    df = pd.DataFrame({'Time':x, 'Value':y})
    with open('CSVFileName.csv', 'a+', newline='') as f:
        df.to_csv(f, index=False, encoding='utf-8', mode='a')
        f.close()
    

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2018-05-24
      • 1970-01-01
      • 2020-09-13
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多