我有一个名为'r2.csv'的示例csv文件:
Factory | Product_Number | Date | mu | cs | co
--------------------------------------------------------------
A | 1 | 01APR2017 | 5.6 | 125 | 275
--------------------------------------------------------------
A | 1 | 02APR2017 | 4.5 | 200 | 300
--------------------------------------------------------------
A | 1 | 03APR2017 | 6.6 | 150 | 250
--------------------------------------------------------------
A | 1 | 04APR2017 | 7.5 | 175 | 325
--------------------------------------------------------------
我想再添加一个名为'Order_Number'
的列。具有以下功能
Order_Number = np.ceil(poisson.ppf(co/(cs+co), mu))
使用以下代码:
import numpy as np
from scipy.stats import poisson, norm
import csv
# Read Data
with open('r2.csv', 'r') as infile:
reader = csv.DictReader(infile)
data = {}
for row in reader:
for header, value in row.items():
try:
data[header].append(value)
except KeyError:
data[header] = [value]
# To create a list for the following parameters
mu = data['mu']
cs = data['cs']
co = data['co']
# Obtain Order_Number
Order_Number = np.ceil(poisson.ppf(co/(cs+co), mu))
在获取'Order_Number'之前,它可以正常工作。和'Order_Number'函数有以下错误: TypeError:/:'list'和'list'
不支持的操作数类型如何更改我的代码以获取下表作为输出:
Factory | Product_Number | Date | mu | cs | co | Order_Number
----------------------------------------------------------------------
A | 1 | 01APR2017 | 5.6 | 125 | 275 | ?
----------------------------------------------------------------------
A | 1 | 02APR2017 | 4.5 | 200 | 300 | ?
----------------------------------------------------------------------
A | 1 | 03APR2017 | 6.6 | 150 | 250 | ?
----------------------------------------------------------------------
A | 1 | 04APR2017 | 7.5 | 175 | 325 | ?
----------------------------------------------------------------------
答案 0 :(得分:0)
您的mu
,cs
和co
内容似乎是字符串列表。
首先将其转换为float
。
mu = map(float,mu)
cs = map(float,cs)
co = map(float,co)
然后,由于您有值列表,因此需要将np.ceil(poisson.ppf(co/(cs+co), mu))
函数映射到这些列表的每个值。
Order_Number =map(lambda mu_,cs_,co_:np.ceil(poisson.ppf(co_/(cs_+co_),mu_)),mu,cs,co)
结果如下,
>>> map(lambda mu_,cs_,co_:np.ceil(poisson.ppf(co_/(cs_+co_), mu_)),mu,cs,co)
[7.0, 5.0, 7.0, 8.0]
希望这会有所帮助。
EDIT-1
将数据添加到csv
文件的代码。您可能需要查看打开csv
到orderedDict
,这样您就不需要手动编写每个列标题。你可以打电话给data.keys()
。
#Covnert string element of list to float
mu = map(float,mu)
cs = map(float,cs)
co = map(float,co)
# Obtain Order_Number
Order_Number =map(lambda mu_,cs_,co_:np.ceil(poisson.ppf(co_/(cs_+co_),mu_)),mu,cs,co)
#Add Oder_Number to the data dict
data['Order_Number'] = Order_Number
header = 'Factory','Product_Number','Date','mu','cs','co','Order_Number'
#Add data to csv
with open("output.csv",'wb') as resultFile:
wr = csv.writer(resultFile,quoting=csv.QUOTE_ALL)
wr.writerow(header)
z = zip(data['Factory'],data['Product_Number'],data['Date'],data['mu'],data['cs'],data['co'],data['Order_Number'])
for i in z:
wr.writerow(i)
答案 1 :(得分:0)
创建
mu = data['mu']
cs = data['cs']
co = data['co']
是字符串列表。看看它们,或者至少是一个子集,例如mu[:10]
。你不能用列表进行数组数学
co/(cs+co)
cs+co
将连接2个列表(列表的+
定义),但未为列表定义/
。
mu = np.array(data, dtype=float)
cs = ....
co
可能会做到这一点,将列表转换为1d numpy数组。
另一种方法是使用np.genfromtxt
dtype=None
和names=True
将数据加载到结构化数组中。但后来我必须解释如何访问命名字段。不幸的是,在这个数组中添加一个新字段(计算结果)并非易事。从结构化数组中编写新的csv需要一些额外的知识。
尝试列表进行数组转换。