2013-12-19 2 views
11

파이썬 용 팬더는 멋집니다. 사전 목록을 판다 데이터 프레임으로 대체하려고합니다. 그러나 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 업데이트 된 값이 포함되어 있습니다. 매우 편리! 그러나 목록의 - dicts는 매우 불확실합니다. 특히 판다가 탁월한 열 단위로 계산할 수 있기를 바랍니다.

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 여기 그대로 유지 :

는 그래서 위에서 trialList을 부여, 그래도 나는 같은 팬더 뭔가 수행하여 더 나은 만들 수 있습니다. 행 단위로 값을 업데이트하는 쉬운 방법이 있나요? 아마도 dict-version과 동일할까요? 참가자별로 많은 시험이 제공되고 각 시험에서 다양한 데이터가 수집되는 실험을위한 행 단위 행렬이 중요합니다. 당신이 정말로 행 단위 작전을 원하는 경우에

답변

30

, 당신은 사용할 수 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

@ 요나 요점은 벡터화 된 솔루션이 항상 가장 빠를 것입니다. 행 단위로 반복하는 것은 ** 느린 **입니다 (일반적으로 피할 수 있습니다). –

+0

필자의 경우 데이터가 수집되기 전에 실험이 진행되고 분석이 "온라인"으로 수행되어야하므로 시험 데이터가 시험 버전으로 업데이트됩니다. 따라서 한 번에 모든 행에 대한 작업을 수행 할 수 없습니다. –