2017-01-25 3 views
1

비슷한 질문이 있지만 다음에 대한 간단한 답을 찾을 수 없습니다. 나는 R에서 왔고 Pandas에게는 아주 새로운 점에 유의하십시오.팬더 데이터 프레임의 새 열 계산

"측정"(3 단계의 유니 코드)과 "Airquality"(numpy.float64)의 두 열이 포함 된 판다 데이터 프레임 df가 있다고 가정 해보십시오.

"Airquality"의 값을 기반으로하는 "color"라는 세 번째 열을 만들고 싶습니다. 또한, 나는 "측정"의 각 수준에 대해이 작업을 개별적으로 수행하려고합니다. df.loc을 사용하여 "측정"에서 df를 분할하여 성공했습니다. 더 나은 방법이있을

#calculate the maximum value of "Airquality" in df for each "measure" level: 
maxi = df['Airquality'].max() 

#initialize the column for "color" in df for each "measure" level: 
df['color'] = None 

#find the maximum value of "Airquality" in df for each "measure" level: 
maxi = df['Airquality'].max() 

#loop through the rows calculating and assigning the value for color, 
#again, in df for each "measure" level 
for i in range(len(df['Airquality'])): 
    df['color'][i] = int(100*df['Airquality'][i]/maxi)] 

그러나, 이것이 내가 함께 일하고 있어요 큰 데이터 세트와 함께 매우 느리게 실행, 나는 확신 : 나는 다음 코드를 사용하여 df라고 각각 별도로 "컬러"를 계산 ... 아마도 판다 (Pandas)의 일부 기능을 사용하고 아마도 df를 세 가지로 나눌 필요없이 각각의 "측정"레벨에 하나씩 사용할 것입니다. 많은 Python 천재 중 한 사람에게서 배우기를 기대하면서 이것을 게시하십시오.

답변

3

난 당신이 특정 transform에서 groupby 도구를 사용할 수 있다고 생각합니다. 프레임에서 시작 (BTW, 예를 제시하는 관습 간주하는 것은 자신을 dataframe) : 우리가 서로 다른의 AQ 컬럼의 최대 값을 찾는 측정 열을 그룹화하여 올바른 분모를 얻을 수 있기 때문에 작동

In [21]: df = pd.DataFrame({"measure": ["a","a","b","a","c","c"], 
    ...:     "aq": [10,20,30,20,30,50]}) 

In [22]: df["colour"] = (100.0 * df["aq"]/
         df.groupby("measure")["aq"].transform(max)) 

In [23]: df 
Out[23]: 
    aq measure colour 
0 10  a 50.0 
1 20  a 100.0 
2 30  b 100.0 
3 20  a 100.0 
4 30  c 60.0 
5 50  c 100.0 

측정 값을 계산하고 전체 프레임까지 브로드 캐스팅하면 다음과 같이됩니다.

In [24]: df.groupby("measure")["aq"].transform(max) 
Out[24]: 
0 20 
1 20 
2 30 
3 20 
4 50 
5 50 
Name: aq, dtype: int64 
+0

굉장, 그 작품 (그리고 훨씬 더 빠름)! 나는 한 지점에서 그와 가까운 것이 있었지만 결코 작동하지는 못했습니다. '.transform (max)'가'.max()'와 어떻게 다른지 모르지만, 나는 그것을 읽을 것이다. 엄청 고마워! 아, 앞으로 몇 가지 예제 데이터를 제공 할 것입니다. – davo1979

+0

가장 쉬운 방법입니다. '.max()'는 각각 다른 측정 값을위한 3 개의 최대 값을 가진 시리즈를 제공합니다; '.transform (max)'는 6 개의 값을 가진 시리즈를 제공하는데, 원래 프레임의 각기 다른 행에 대해 하나씩 올바르게 일치시킵니다. – DSM

2

저는 천재는 아니지만 팬더와 함께 갈 것입니다 apply. 사용 즉, 같은 : 평소와 같이 문서의

df['newcol'] = df.apply(lambda row: row['firstcolval'] * row['secondcolval'], axis=1) 

상세 정보 : http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html

+0

감사합니다. 조금만 적용 해 보았습니다. 그러나 "측정"의 세 가지 수준에 대해 별도로 코드를 작성하는 방법이 있습니까? 아니면 별도의 세 가지 데이터 프레임을 계속 사용해야합니까? 또한 "측정"의 각 수준마다 "최대 값"의 다른 값이 있음을 명심하십시오. – davo1979

+2

@ davo1979 "측정"을 나누는 것이 무슨 뜻인지 이해하지 못합니다 ... 질문에 예제 데이터를 제공하고 원하는 출력을 제공 할 수 있습니까? – makaveli

관련 문제