2013-12-19 21 views
11

Pythonのパンダはきちんとしています。私は辞書のリストをパンダのデータフレームに置き換えようとしています。しかし、for-loopで行単位で値を簡単に変更できる方法があるのでしょうか?パンダのデータフレームを行単位で編集

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!' 

...とtrialはそれに戻って参照しているため、今trialListは、更新された値が含まれています。ここでは

は非パンダのdictのバージョンです。とても便利な!しかし、ディクテーションのリストは、特に私がパンダが優秀なものを列方向に計算できるようにするためには、非常に不安です。

私が何かパンダ-などを行うことによって、より良い、それを作ることができてもだから私は、上から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は、ここで変更されません。行ごとに値を更新する簡単な方法はありますか?おそらくdict-versionと同等ですか?参加者には多くの試行が行われ、各試行ごとにさまざまなデータが収集されるため、これは行単位で行うことが重要です。

答えて

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

私の場合、被験者が実験を経て、データが収集される前に分析を「オンライン」にする必要があるため、データは試用版で更新されます。したがって、一度にすべての行に対する操作は不可能です。 –

関連する問題