我想在使用
pandas
创建的 CSV 文件中写一些注释。我在 DataFrame.to_csv
中没有找到任何选项(尽管 read_csv
可以跳过注释),在标准 csv
模块中也没有找到任何选项。我可以打开文件,写入注释(以 #
开头的行),然后将其传递给 to_csv
。有没有人有更好的选择?
df.to_csv
接受文件对象。因此,您可以在 a
模式下打开文件,编写注释并将其传递给数据框 to_csv 函数。
例如:
In [36]: df = pd.DataFrame({'a':[1,2,3], 'b':[1,2,3]})
In [37]: f = open('foo', 'a')
In [38]: f.write('# My awesome comment\n')
In [39]: f.write('# Here is another one\n')
In [40]: df.to_csv(f)
In [41]: f.close()
In [42]: more foo
# My awesome comment
# Here is another one
,a,b
0,1,1
1,2,2
2,3,3
@Vor 的解决方案的另一种方法是首先将注释写入文件,然后使用
mode='a'
和 to_csv()
将数据帧的内容添加到同一文件中。根据我的基准(如下),这大约需要以附加模式打开文件,添加注释,然后将文件处理程序传递给 pandas (根据@Vor的答案)。考虑到这是 pandas 在内部所做的事情(DataFrame.to_csv()
调用 CSVFormatter.save()
,它使用 _get_handles()
通过 open()
读取文件),类似的时间安排是有意义的。
另外,通过
with
语句可以方便地处理文件 IO,这可以确保打开的文件在使用完后关闭并保留 with
语句。请参阅下面的基准测试中的示例。
import pandas as pd
# Read in the iris data frame from the seaborn GitHub location
iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
# Create a bigger data frame
while iris.shape[0] < 100000:
iris = iris.append(iris)
# `iris.shape` is now (153600, 5)
%%timeit -n 5 -r 5
# Open a file in append mode to add the comment
# Then pass the file handle to pandas
with open('test1.csv', 'a') as f:
f.write('# This is my comment\n')
iris.to_csv(f)
每次循环 972 ms ± 31.9 ms(5 次运行的平均值 ± 标准差,每次 5 个循环)
to_csv(mode='a')
%%timeit -n 5 -r 5
# Open a file in write mode to add the comment
# Then close the file and reopen it with pandas in append mode
with open('test2.csv', 'w') as f:
f.write('# This is my comment\n')
iris.to_csv('test2.csv', mode='a')
每次循环 949 ms ± 19.3 ms(5 次运行的平均值 ± 标准差,每次 5 个循环)