如果要将panda.DataFrame或pandas.Series数据导出为csv文件或将其添加到现有的csv文件中,请使用to_csv()方法。由于分隔符可以更改,因此也可以将其另存为tsv文件。
将描述以下内容。
读取csv文件请参阅以下文章。
以下面的数据为例。
import pandas as pd
df = pd.read_csv('./data/34/sample_pandas_normal.csv', index_col=0)
print(df)
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
panda.DataFrame或pandas.Series提供To_csv()方法。
将路径指定为第一个参数,则将输出csv文件。
df.to_csv('./data/34/to_csv_out.csv')
如果只想导出特定的列,在参数列中指定列名称的列表。
默认值为“none”,所有列均输出。
df.to_csv('./data/34/to_csv_out_columns.csv', columns=['age'])
在参数header和index中使用True或False指定是否指定header(列名,pandas.DataFrame的列)和index(行名,pandas.DataFrame的索引)。默认值为True。
df.to_csv('./data/34/to_csv_out_header_index.csv', header=False, index=False)
输出文件的编码由参数编码指定。 对于Python3,默认值为utf-8。
分隔符由参数sep指定。 如果要将其另存为由制表符\t分隔的tsv文件,请进行以下设置。
默认值为逗号“,”。
df.to_csv('./data/34/to_csv_out.tsv', sep='\t')
写入模式由参数mode指定。
默认值为“ w”。与前面的示例一样,如果指定的路径不存在,则将重新创建该路径,如果存在,则将其覆盖。
与内置函数open()一样,如果要防止覆盖现有文件,请设置mode =‘x’。如果指定的路径不存在,将创建一个新路径,如果存在,则将发生错误。
如果在to_csv()方法的第一个参数中指定了现有csv文件的路径后指定了mode =‘a’,则会添加该文件。仅将pandas.DataFrame的内容添加到现有文件的末尾。
显示了将相同数据添加到文件后立即保存的示例。请注意,如果未设置header = False,则将按原样添加标头(pandas.DataFrame的列)。
df.to_csv('./data/34/to_csv_out_a.csv')
df.to_csv('./data/34/to_csv_out_a.csv', mode='a', header=False)
如果要从现有的csv文件中读取数据并通过代码处理将具有通过代码处理添加/更新的行和列的DataFrame写入具有相同名称的文件,则可以使用mode ='w’覆盖它(可以将其省略,因为它是默认设置)。
df.to_csv('./data/34/to_csv_out_a_new_column.csv')
df = pd.read_csv('./data/34/to_csv_out_a_new_column.csv', index_col=0)
print(df)
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
df['new_col'] = 'new data'
print(df)
# age state point new_col
# name
# Alice 24 NY 64 new data
# Bob 42 CA 92 new data
# Charlie 18 CA 70 new data
# Dave 68 TX 70 new data
# Ellen 24 CA 88 new data
# Frank 30 NY 57 new data
df.to_csv('./data/34/to_csv_out_a_new_column.csv')
以下面的pandas.DataFrame为例。
df = pd.DataFrame({'col1': [0.123456789, 1000000000.0],
'col2': [123456789.0, 0.0],
'col3': [123456789, 0]})
print(df)
# col1 col2 col3
# 0 1.234568e-01 123456789.0 123456789
# 1 1.000000e+09 0.0 0
print(df.dtypes)
# col1 float64
# col2 float64
# col3 int64
# dtype: object
尽管它在print()中以指数符号显示,但这是由于显示设置所致,并且值本身未四舍五入。
print(df.iat[0, 0])
# 0.123456789
print(df.iat[1, 0])
# 1000000000.0
使用to_csv()保存时,默认情况下会保存该值。
df.to_csv('./data/34/to_csv_out_float_default.csv')
可以使用to_csv()的参数float_format指定保存时浮点数float的格式。
更改显示设置时,格式由可调用对象(例如format())指定,但是在to_csv()中,指定了printf format%中使用的格式字符串。
例如,要将小数点后的位数设置为3位,请按照以下步骤操作。
print('%.3f' % 0.123456789)
# 0.123
print('%.3f' % 123456789)
# 123456789.000
df.to_csv('./data/34/to_csv_out_float_format_3f.csv', float_format='%.3f')
小数点后三位数的指数表示法如下。
print('%.3e' % 0.123456789)
# 1.235e-01
print('%.3e' % 123456789)
# 1.235e+08
df.to_csv('./data/34/to_csv_out_float_format_3e.csv', float_format='%.3e')
如果像上面的示例一样指定并保存了位数,则自然会丢失保存位数以下的信息。
顾名思义,参数float_format仅对数据类型为浮点数float的列有效。如上例所示,整数int列保持不变。另外,不能为每列指定不同的格式。
如果要指定整数int列的格式,或者要为浮点数float的每一列指定不同的格式,请将原始pandas.DataFrame转换为任何格式的字符串,然后保存。
df['col1'] = df['col1'].map('{:.3f}'.format)
df['col2'] = df['col2'].map('{:.3e}'.format)
df['col3'] = df['col3'].map('{:#010x}'.format)
print(df)
# col1 col2 col3
# 0 0.123 1.235e+08 0x075bcd15
# 1 1000000000.000 0.000e+00 0x00000000
print(df.dtypes)
# col1 object
# col2 object
# col3 object
# dtype: object
df.to_csv('./data/34/to_csv_out_float_format_str.csv')
请注意,如本例所示,如果将整数int保存为十六进制数,则pd.read_csv()会将其读取为字符串。如果要将其视为数字值,则需要在读取后将其转换。
df = pd.read_csv('./data/34/to_csv_out_float_format_str.csv', index_col=0)
print(df)
# col1 col2 col3
# 0 1.230000e-01 123500000.0 0x075bcd15
# 1 1.000000e+09 0.0 0x00000000
print(df.dtypes)
# col1 float64
# col2 float64
# col3 object
# dtype: object
df['col3'] = df['col3'].map(lambda x: int(x, 16))
print(df)
# col1 col2 col3
# 0 1.230000e-01 123500000.0 123456789
# 1 1.000000e+09 0.0 0
print(df.dtypes)
# col1 float64
# col2 float64
# col3 int64
# dtype: object