为数据框中的每个元素添加值

时间:2017-08-25 09:57:15

标签: python arrays r numpy dataframe

我是python(/编程)的新手并且有一个相当基本的问题:

我想采用一种数据结构(基本上是一个数据框,但不确定这是否是最有效的结构),它具有如下数值:

     0     1     2     3     4     5
 0  0.0   1.0   7.0  22.0  14.0  28.0
 1  0.0  99.0  15.0  99.0  99.0  99.0
 2  1.0   0.0  21.0  18.0  21.0  14.0
 3  2.0   6.0  20.0  38.0   8.0  21.0
 4  2.0   6.0  20.0  39.0   8.0  16.0
 5  2.0   9.0  99.0  39.0   8.0  16.0
 6  2.0   9.0  99.0  39.0   8.0  21.0
 7  2.0   9.0  99.0  99.0   8.0  16.0

我想一次向每个单元格添加一个值(例如1),同时保持其他单元不变,即将第一行更改为

1.0   1.0   7.0  22.0  14.0  28.0
0.0   2.0   7.0  22.0  14.0  28.0
0.0   1.0   8.0  22.0  14.0  28.0
0.0   1.0   7.0  23.0  14.0  28.0
0.0   1.0   7.0  22.0  15.0  28.0
0.0   1.0   7.0  22.0  14.0  29.0

我希望依次为每一行执行此操作,并可能将修改集合保存到列表中。

如上所述,我在这方面相当新,我只是设法一次性更改元素,或者我可以按顺序更改它们,但之前的修改仍然存在。

options=[]
import numpy as np
f = np.array(Data)
for i in xrange(8):
    for j in xrange(6):
    f[i,j] +=1
    options.append(f)

python或R欢迎任何解决方案!

2 个答案:

答案 0 :(得分:0)

我对numpy没有经验,但你应该能够做到以下几点;

class matrix(object):
    def __init__(self, size, values):
        self.width = size[0]
        self.heigth = size[1]
        self.size = size
        if len(values) != self.heigth*self.width:
            raise ValueError("values don't match dimensions")
        else:
            self.data = []
            for y in range(len(values)):
                if y%self.width == 0:
                    self.data.append([])
                self.data[y//self.width].append(values[y])
    def addfloat(self, value):
        output = self.data
        for y in output:
            for x in y:
                output.append(x + value)
        return matrix(self.size, output)

基本上我创建了一个“矩阵”类,然后为它执行浮点运算的函数。 实施例;

matrix((2, 2), (1, 2, 2, 1)).addfloat(1.2).data

返回

[[2.2, 3.2], [3.2, 2.2]]

答案 1 :(得分:0)

为避免保留先前的修改,您可以在修改数组或附加到列表之前创建数组的副本,例如:

import numpy as np

options = []
f = np.array(Data)
for i in xrange(8):
    for j in xrange(6):
        ar2 = f.copy()
        ar2[i, j] += 1
        options.append(ar2)

然而,完全避免在阵列上显式循环可能会更好。对于你的numpy数组f,这可能看起来像:

options = (np.identity(f.size)+f.flatten()).reshape((f.size,)+f.shape)

这将返回一个三维numpy数组,您可以从中提取所需的2-d numpy数组,其索引类似于您当前列表中使用的索引。

顺便说一句,Data是一个pandas数据帧,因为它似乎出现在你的第一个代码块中?如果是这样,您可以使用values属性Data.values从中获取一个numpy数组,并且不需要显式创建数组。

相关问题