【问题标题】:Python read csv file and add one column through function computationPython读取csv文件并通过函数计算添加一列
【发布时间】:2017-04-12 16:38:29
【问题描述】:

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

【问题讨论】:

  • 我不确定您是否有能力在当前环境中安装软件包,但如果可以的话,您真的应该考虑安装pandas。这将使这种类型的数据操作变得相当简单。一般来说,您可能会喜欢pydata 提供的套件套件
  • 谢谢! @tipanverella我目前正在使用Anaconda Navigator,并且可以安装'pandas'。但是,作为建议,实际生产水平可能没有“熊猫”包,我必须考虑目前是否可以正常使用。

标签: python csv numpy


【解决方案1】:

看起来您的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 文件的代码。您可能想查看将您的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)

结果

【讨论】:

  • 谢谢! @Anil_M。这对我很有效,我可以返回 [7.0, 5.0, 7.0, 8.0] 我如何将此列添加到先前的数据中?
  • 非常感谢!
  • 抱歉,还有一个问题:如果我想定义一个可以按照您上面建议的那样用于数组的函数。 G = poisson(mu) p = G.pmf(np.arange(3*mu)) def Z(Q): for i in range(len(p)): yield p[i]*cs1*max((Q-i), 0) + p[i]*co1*max((i-Q), 0) 我怎样才能做到这一点?因为它具有相同的错误消息 **ValueError: can only convert a array of size 1 to a Python scalar。 ** 谢谢!
  • 您能否发布一个不同的问题并让我知道。根据 SO 礼节,不同的问题需要提出不同的问题。
  • 知道了!感谢@Anil_M 发布名称为“Python 更改计算数组的函数”。
【解决方案2】:

创建时

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

尝试列表到数组的转换。

【讨论】:

  • 嗨@hpaulj,谢谢,这就是问题所在,我用它来转换并得到解决方案。从你的描述中添加一个新字段到我的“数据”我应该如何完成这个过程?
  • 如果您已经习惯使用csv Reader 阅读器,那么坚持使用它进行写作可能是最简单的。
  • 是的,原谅我的幼稚
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2021-07-10
相关资源
最近更新 更多