2013-12-19 139 views
11

python的pandas是整齐的。我试图用熊猫数据框来替换字典列表。但是,我想知道有一种方法可以在for循环中逐行更改值,就像一样简单?逐行编辑熊猫数据帧

这里的非大熊猫字典版本:

trialList = [ 
    {'no':1, 'condition':2, 'response':''}, 
    {'no':2, 'condition':1, 'response':''}, 
    {'no':3, 'condition':1, 'response':''} 
] # ... and so on 

for trial in trialList: 
    # Do something and collect response 
    trial['response'] = 'the answer!' 

...现在trialList包含更新的值,因为trial指回到那个。非常便利!但是,列表的列表非常不方便,特别是因为我希望能够计算大熊猫擅长的列方式的东西。

所以从上面给出trialList,不过,我觉得我可以使它甚至做一些熊猫样更好:

import pandas as pd  
dfTrials = pd.DataFrame(trialList) # makes a nice 3-column dataframe with 3 rows 

for trial in dfTrials.iterrows(): 
    # do something and collect response 
    trials[1]['response'] = 'the answer!' 

...但trialList保持不变在这里。有没有一种简单的方法来逐行更新值,也许等同于字典版本?重要的是,它是逐行的,因为这是一个实验,参与者接受大量试验并在每次试验中收集各种数据。

回答

30

如果你真的想行由行OPS,你可以使用iterrowsloc

>>> for i, trial in dfTrials.iterrows(): 
...  dfTrials.loc[i, "response"] = "answer {}".format(trial["no"]) 
...  
>>> dfTrials 
    condition no response 
0   2 1 answer 1 
1   1 2 answer 2 
2   1 3 answer 3 

[3 rows x 3 columns] 

更好,虽然是当你可以向量化:

>>> dfTrials["response 2"] = dfTrials["condition"] + dfTrials["no"] 
>>> dfTrials 
    condition no response response 2 
0   2 1 answer 1   3 
1   1 2 answer 2   3 
2   1 3 answer 3   4 

[3 rows x 4 columns] 

而且总是有apply

>>> def f(row): 
...  return "c{}n{}".format(row["condition"], row["no"]) 
... 
>>> dfTrials["r3"] = dfTrials.apply(f, axis=1) 
>>> dfTrials 
    condition no response response 2 r3 
0   2 1 answer 1   3 c2n1 
1   1 2 answer 2   3 c1n2 
2   1 3 answer 3   4 c1n3 

[3 rows x 5 columns] 
+1

谢谢!最重要的是我需要的。不如我想要的那么美观/简单,但它有效。 –

+0

@Jonas问题在于矢量化解决方案永远是最快的。逐行迭代是**慢**(通常可以避免)。 –

+0

在我的情况下,数据是通过试验更新试验的,因为受试者需要在收集所有数据之前进行“在线”实验和分析。因此,不可能一次对所有行进行操作。 –