在忽略字符串的同时将 CSV 文件中的数字截断为 3 个小数位

bir*_*era 0 python csv decimal

所以我有一个包含一堆数字和单词的 CSV 文件,我需要将数字截断到小数点后三位,但到目前为止我尝试过的所有内容都不起作用,因为字符串:我收到一条错误消息说'无法将字符串转换为浮点数'。

我使用了这里建议的代码:format to 3 decimal places all decimal numbers in csv file python

并得到了那个错误。

代码看起来像(假设所有缩进都是正确的):

with open('metaanalysis_data.csv', 'rb') as f_input, 
open('metaanalysis_datas.csv', 'wb') as f_output:
    csv_input = csv.reader(f_input, quotechar="'")
    csv_output = csv.writer(f_output)
    csv_output.writerow(next(csv_input))

    for cols in csv_input:
        for i in cols:
            for i in xrange(1, 10):
            #if i != str:
                cols[i] = '{:.3f}'.format(float(cols[i]))
        csv_output.writerow(cols)
Run Code Online (Sandbox Code Playgroud)

我尝试添加:

if i is float:
Run Code Online (Sandbox Code Playgroud)

在 'for i in xrange(1, 10)' 之前,我尝试了同样的事情,它清除了我的错误消息,但导致文件根本没有被修改。

请帮忙!谢谢!

小智 5

在 Python 中使用 Pandas,你应该能够像这样完成这项工作:

# load pandas package
import pandas as pd

# read in initial file
dataset = pd.read_csv('metaanalysis_data.csv')

# create function that tries to round input to three decimal places,
# returns input if failure occurs (e.g. if not a float)
def try_cutoff(x):

    try:
        return round(float(x), 3)
    except Exception:
        return x

# loop over each column and apply try_cutoff to each element in each column
for field in dataset.columns:


    dataset[field] = dataset[field].map(try_cutoff)

# write new dataset result to CSV file
dataset.to_csv("some_new_file.csv", index = False)
Run Code Online (Sandbox Code Playgroud)

因此,这实际上创建了一个函数 try_cutoff,它将尝试将元素四舍五入到小数点后三位。如果它命中一个字符串,那么它只会返回该字符串。然后,对数据框中的每一列运行此操作,并将新数据框写入文件。

请让我知道这是否适合您。