web-dev-qa-db-ja.com

編集pandas dataframe行ごと

pythonのパンダは素晴らしいです。辞書のリストをpandas-dataframeで置き換えようとしています。しかし、値を行ごとに変更する方法があるのだろうかと思います。 forループの行も同じくらい簡単ですか?

これがパンダではないdict-versionです:

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には更新された値が含まれます。とても便利な!しかし、dicts-of-dictsは非常に便利ではありません。特に、pandas Excel atであるものを列ごとに計算できるようにしたいためです。

だから、上記の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と同等ですか?これは行ごとに行うことが重要です。これは、参加者に多数の試行が提示され、各試行ごとにさまざまなデータが収集される実験のためです。

14
Jonas Lindeløv

行ごとの演算が本当に必要な場合は、iterrowsおよびlocを使用できます。

>>> 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]
40
DSM