【发布时间】: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