用pandas编写单个CSV标头
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用pandas编写单个CSV标头相关的知识,希望对你有一定的参考价值。
我正在将数据解析为列表并使用pandas来构建和写入CSV文件。首先,我的数据被带入一个集合,其中inv,name和date都是包含大量条目的列表。然后我使用concat将每次迭代通过我解析的数据集连接到CSV文件,如下所示:
counter = True
data = {'Invention': inv, 'Inventor': name, 'Date': date}
if counter is True:
df = pd.DataFrame(data)
df = df[['Invetion', 'Inventor', 'Date']]
else:
df = pd.concat([df, pd.DataFrame(data)])
df = df[['Invention', 'Inventor', 'Date']]
with open('./new.csv', 'a', encoding = utf-8) as f:
if counter is True:
df.to_csv(f, index = False, header = True)
else:
df.to_csv(f, index = False, header = False)
counter = False
对于我正在解析的所有数据,counter = True语句驻留在迭代循环之外,因此每次都不会覆盖。
所以这意味着它只运行一次我的数据来获取第一个df集,然后再进行连接。问题是即使counter只是第一轮的True,也适用于df的第一个if语句,它对我写入文件不起作用。
会发生什么事情是标题一遍又一遍地写 - 无论计数器只是True一次。当我在计数器为True时交换header = False,那么它永远不会写入标题。
我认为这是因为df以某种方式保持头部的连接,但除此之外我无法弄清楚逻辑错误。
是否有另一种方法我也可以一次只写一次头文件到同一个CSV文件?
如果没有看到其余的代码,很难说出可能出现的问题。我开发了一些有效的测试数据和逻辑;你可以根据自己的需要进行调整。
请试试这个:
import pandas as pd
early_inventions = ['wheel', 'fire', 'bronze']
later_inventions = ['automobile', 'computer', 'rocket']
early_names = ['a', 'b', 'c']
later_names = ['z', 'y', 'x']
early_dates = ['2000-01-01', '2001-10-01', '2002-03-10']
later_dates = ['2010-01-28', '2011-10-10', '2012-12-31']
early_data = {'Invention': early_inventions,
'Inventor': early_names,
'Date': early_dates}
later_data = {'Invention': later_inventions,
'Inventor': later_names,
'Date': later_dates}
datasets = [early_data, later_data]
columns = ['Invention', 'Inventor', 'Date']
header = True
for dataset in datasets:
df = pd.DataFrame(dataset)
df = df[columns]
mode = 'w' if header else 'a'
df.to_csv('./new.csv', encoding='utf-8', mode=mode, header=header, index=False)
header = False
或者,您可以连接循环中的所有数据并在结尾处写出数据帧:
df = pd.DataFrame(columns=columns)
for dataset in datasets:
df = pd.concat([df, pd.DataFrame(dataset)])
df = df[columns]
df.to_csv('./new.csv', encoding='utf-8', index=False)
如果您的代码无法符合此API,则可以放弃在to_csv中完全写入标头。您可以检测输出文件是否存在,如果不存在,则首先将标头写入其中:
import os
fn = './new.csv'
if not os.exists(fn):
with open(fn, mode='w', encoding='utf-8') as f:
f.write(','.join(columns) + '\n')
# now append the dataframe without a header
df.to_csv(fn, encoding='utf-8', mode='a', header=False, index=False)
以上是关于用pandas编写单个CSV标头的主要内容,如果未能解决你的问题,请参考以下文章
为啥用 Pandas 编写时 CSV 文件比 HDF5 文件小?
使用 Pandas 在选项卡中的单个 csv 表中添加多个 csv
使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧