【问题标题】:Append pandas DataFrame to csv with fixed header将 pandas DataFrame 附加到带有固定标头的 csv
【发布时间】:2018-11-03 20:57:04
【问题描述】:

我想迭代地将 pandas DataFrames 附加到 csv 文件中。这通常不是问题。但是,DataFrame 可能没有所有列。因此,只需将 DataFrame 附加到错误的列即可。

我从

开始
with open('test.csv', 'w') as output:
    writer = csv.writer(output, delimiter=',')
    writer.writerow(['a','b', 'c'])

然后例如我添加 DataFrame df

    a   b   c
0   2   2.0 3
1   2   NaN 3

使用命令

df = pd.DataFrame([{'a':2, 'b':2, 'c':3}, {'a':2, 'c':3}])
df.to_csv('test.csv', index = False, header = False, mode = 'a') 

但是,我要附加的下一个 DataFrame 可能看起来像

    a   c
0   1   1
1   1   1

当我再次附加它时,我不会写标题,因为它已经存在。像以前一样(按预期)做同样的事情是行不通的:

df =pd.DataFrame([{'a':1, 'c':1}, {'a':1, 'c':1}])
df.to_csv('test.csv', index = False, header = False, mode = 'a')

它产生了

    a   b   c
0   2   2.0 3.0
1   2   NaN 3.0
2   1   1.0 NaN
3   1   1.0 NaN

当然,我可以将现有的 csv 导入 DataFrame,然后追加并覆盖旧文件:

file = pd.read_csv('test.csv')
df =pd.DataFrame([{'a':1, 'c':1}, {'a':1, 'c':1}])
file = file.append(df)
file.to_csv('test.csv', index = False, header = True)
pd.read_csv('test.csv')

这正是我想要的

    a   b   c
0   2   2.0 3
1   2   NaN 3
2   1   NaN 1
3   1   NaN 1

但是当我多次重复该过程时,总是读取整个 csv 文件并附加到 pandas 并覆盖 csv 肯定会影响性能。我想将我的中间结果写入 csv,因为如果我只在 pandas DataFrame 中附加然后发生错误,所有聚合数据都会丢失。我的问题有更好的解决方案吗?

我也尝试添加新的空列,但它们在最后添加,这无济于事,但可能有助于找到性能更好的解决方案。

def append_to_csv(df, file):
    if not os.path.exists(file):
        pd.to_csv(file, index = False, header = True)
    else:
        with open(file) as f:
            header = next(csv.reader(f))
        columns = df.columns
        for column in set(header) - set(columns):
            df[column] = np.nan
        df.to_csv(file, index = False, header = False, mode = 'a')

【问题讨论】:

    标签: python pandas csv dataframe


    【解决方案1】:

    您始终可以像这样在df 中附加一个空列:

    In [958]: df['b']=''
    

    然后重新构造df 像:

    In [959]: df = df[['a','b','c']]
    
    In [960]: df
    Out[960]: 
       a b  c
    0  1    1
    1  1    1
    

    现在,将其写入 csv。

    In [961]: df.to_csv('test.csv', index = False, header = False, mode = 'a')
    

    如果这有帮助,请告诉我。

    【讨论】:

    • 重组是关键,谢谢!正是我需要的。
    【解决方案2】:

    为了完整起见,我在这里添加了使用 Mayank Porwal 回答的函数: 每当您想将 DataFrame 附加到具有指定标头的 csv 时。如果要允许新列(不包含在标题中),则需要修改函数。

    def append_to_csv(df, file):
        with open(file) as f:
            header = next(csv.reader(f))
        columns = df.columns
        for column in set(header) - set(columns):
            df[column] = ''
        df = df[header]
        df.to_csv(file, index = False, header = False, mode = 'a')
    

    【讨论】:

      猜你喜欢
      • 2015-03-06
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2013-10-06
      • 2016-03-25
      • 2019-06-08
      • 2019-05-24
      相关资源
      最近更新 更多