首页 > 解决方案 > python中csv_write.writerow的功能

问题描述

我正在使用 write_csv.writerow 将数据写入 CSV。但是我在单独的 Ex: 中得到每一个数字或字母:123写为 1,2,3 并且显示为1 2 3. 这是我正在使用的代码。

with open('nan.csv','w') as out:
    csvwriter=csv.writer(out)
    csvwriter.writerow(str(df['Purchase'].var()))
    csvwriter.writerow(str(df['Purchase'].std()))
    csvwriter.writerow(str(round(df['Purchase'].skew(),2)))
    csvwriter.writerow(str(round(df['Purchase'].kurt(),1)))

请让我知道我哪里出错了?谢谢

标签: pythonpandasnumpycsv

解决方案


https://docs.python.org/3/library/csv.html#writer-objects说:

Writer 对象(DictWriter 实例和 writer() 函数返回的对象)具有以下公共方法。一行必须是 Writer 对象的字符串或数字的可迭代对象,并且...

在您的代码中,str(...)是 sting 对象,它类似于列表,每个元素都由一个字符组成,因此 writerow 方法将字符串的每个字符一个一个地写入。这种行为是 OP 认为出乎意料的。

与其传递字符串对象,不如传递字符串的可迭代对象,例如字符串列表。要创建字符串列表,您可以将df['Purchase']类型转换为字符串,然后将其值转换为列表。

df['Purchase'].astype(str).tolist()

示例代码:

import pandas as pd
import csv
import io

# create virtual csv file
f = io.StringIO('Purchase\n0,100\n1,200\n2,300')

# read from the csv file
df = pd.read_csv(f)
# In [41]: df
# Out[41]: 
#    Purchase
# 0         1
# 1         2
# 2         3

# create virtual file
f = io.StringIO()
writer = csv.writer(f)

# write csv
writer.writerow(df['Purchase'].astype(str).tolist())

# read from virtual file
f.getvalue()
# In [74]: f.getvalue()
# Out[74]: '100,200,300\r\n'

to_csvpandas中也有方法:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html


推荐阅读