Редактировать pandas dataframe row-by-row
pandas для python является опрятным. Я пытаюсь заменить список словарей на pandas -dataframe. Тем не менее, мне интересно, как легко изменить значения row-by-row в for-loop?
Здесь не-w462 > dict-версия:
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 очень неудобен, особенно потому, что я хотел бы вычислить материал по столбцу, который pandas превосходит.
Итак, учитывая пробный список сверху, я мог бы сделать это еще лучше, выполнив что-то pandas -like:
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-версии? Важно, чтобы это было последовательно, так как это эксперимент, в котором участникам представлено множество испытаний, и различные данные собираются в каждом отдельном испытании.
Ответы
Ответ 1
Если вам действительно нужны операции "поочередно", вы можете использовать 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]