所以我有一个包含大量数字和单词的CSV文件,我需要将数字截断为三位小数,但到目前为止我尝试的所有内容都不起作用,因为字符串:我收到错误消息说 '无法将字符串转换为浮点数。
我使用了此处建议的代码:format to 3 decimal places all decimal number 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)
我尝试添加:
if i is float:
在'for x in xrange(1,10)'之前,我尝试了同样的事情并且它清除了我的错误信息但导致了一个根本没有被修改过的文件。
请帮忙!谢谢!
答案 0 :(得分:3)
在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)
因此,实际上,这会创建一个函数try_cutoff,它将尝试将元素舍入到三个小数位。如果它遇到一个字符串,那么它只会返回该字符串。然后,在数据框中的每一列上运行此操作,并将新数据帧写入文件。
如果适合您,请告诉我。
答案 1 :(得分:1)
问题是只有CSV中的某些值是浮点数,但对于其余值,转换将失败。你可以尝试:
fn main() {
let mut v1: Vec<i32> = Vec::new();
let mut v2: Vec<&i32> = Vec::new();
for i in 1..10 {
v1.push(i);
v2.push(v1.last().unwrap());
}
println!("{:?}", v1);
println!("{:?}", v2);
}
这样,当转化失败时,它会引发error[E0502]: cannot borrow `v1` as mutable because it is also borrowed as immutable
--> src/main.rs:6:9
|
6 | v1.push(i);
| ^^ mutable borrow occurs here
7 | v2.push(v1.last().unwrap());
| -- immutable borrow occurs here
...
11 | }
| - immutable borrow ends here
异常,元素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 row in csv_input:
for i, elem in enumerate(row):
try:
row[i] = '{:.3f}'.format(float(elem))
except ValueError: pass
csv_output.writerow(row)
将保持原样。