Python读取csv文件并通过函数计算添加一列

时间:2017-04-12 16:38:30

标签: python csv numpy

我有一个名为'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 |   ?
----------------------------------------------------------------------

2 个答案:

答案 0 :(得分:0)

您的mucsco内容似乎是字符串列表。
首先将其转换为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文件的代码。您可能需要查看打开csvorderedDict,这样您就不需要手动编写每个列标题。你可以打电话给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)

结果 enter image description here

答案 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=Nonenames=True将数据加载到结构化数组中。但后来我必须解释如何访问命名字段。不幸的是,在这个数组中添加一个新字段(计算结果)并非易事。从结构化数组中编写新的csv需要一些额外的知识。

尝试列表进行数组转换。