2017-08-25 48 views
0

我是新来的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的欢迎!

+1

欢迎来到SO!当你编写“_任何解决方案在Python或R欢迎!_”时,它会使你的问题非常广泛。尽管我可以高兴地提供一个可能的R解决方案,但我认为你应该试着用一种编程语言的每个问题来专注于一个特定的编程问题。就你而言,python似乎是主要优先事项。你可以看看讨论过的meta post:[我为单独的编程语言做了单独的问题吗?](https://meta.stackoverflow.com/questions/272888/do-i-make-separate-questions - 用于-独立的编程语言)。干杯。 – Henrik

回答

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) 

basicly我创建了一个“矩阵”类,然后为它编写一个函数,它的浮动添加。 示例;

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

回报

[[2.2, 3.2], [3.2, 2.2]] 
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) 

这将返回3维数组numpy的,从中你可以用类似于你会为使用的索引中提取您想要的2-d numpy的阵列您当前的列表。

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