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