2017-03-27 5 views
2

가 나는 팬더 DataFrame 있습니다`pandas.cut()`을 사용하여 비닝 된 컬럼 이외의 컬럼을 기반으로 데이터를 비닝하는 방법은 무엇입니까? 다음과 같이

import pandas as pd 
import numpy as np 

data = {"first_column": ["item1", "item2", "item3", "item4", "item5", "item6", "item7"], 
     "second_column": ["cat1", "cat1", "cat1", "cat2", "cat2", "cat2", "cat2"], 
     "third_column": [5, 1, 8, 3, 731, 189, 9]} 

df = pd.DataFrame(data) 

df 
    first_column second_column third_column 
0  item1   cat1    5 
1  item2   cat1    1 
2  item3   cat1    8 
3  item4   cat2    3 
4  item5   cat2   731 
5  item6   cat2   189 
6  item7   cat2    9 

를 자, 내가 pandas.cut()를 사용하여 세 번째 열에의 분류를 보여주는 네 번째 열을 만들고 싶었 가정 해 봅시다. 여기서, third_column의 요소가 10보다 작거나 같으면 각 행에 레이블을 붙입니다. <=10.

df["less_than_ten"]= pd.cut(df.third_column, [-np.inf, 10, np.inf], labels=(1,0)) 

그리고 결과 dataframe 지금 :

 first_column second_column third_column less_than_ten 
0  item1   cat1    5    1 
1  item2   cat1    1    1 
2  item3   cat1    8    1 
3  item4   cat2    3    1 
4  item5   cat2   731    0 
5  item6   cat2   189    0 
6  item7   cat2    9    1 

질문 : 카테고리 cat1cat2와 두 번째 열 second_column을 알 수 있습니다. pandas.cut()을 사용하여 second_column의 "클래스"를 기반으로이 값을 재 분류하려면 어떻게해야합니까?

cat1 위해, 우리는 third_column의 값으로 0 또는 1 라벨은 < 수 = 10이다. cat2의 경우 third_column의 값으로 2 또는 3을 지정하면 < = 10 (2 번은 3 번)입니다.

이 DataFrame은 다음과 같이 보일 것이다 :

 first_column second_column third_column less_than_ten 
0  item1   cat1    5    1 
1  item2   cat1    1    1 
2  item3   cat1    8    1 
3  item4   cat2    3    3 
4  item5   cat2   731    2 
5  item6   cat2   189    2 
6  item7   cat2    9    3 

일이 어떻게합니까? 다른 열의 범주 값을 기반으로 팬더 데이터 프레임에서 한 열의 데이터를 비닝하고 있습니다.

답변

3
  • pd.cut은 필요하지 않습니다. <= 10을 사용하거나이를 사용하거나 int으로 전송할 수 있습니다. le(10)은이 특별한 경우에 <= 10
  • 의 동의어입니다. 매핑 할 사전을 만들 수 있습니다. 그것을 사용하여 범주를 정수로 변환 한 다음 le(10)
  • assign 새 열의 결과에 추가 할 수 있습니다. 당신은 또한 df['less_than_ten'] = 이것을 할 수 있었다 그러나 나는

m = dict(cat1=0, cat2=2) 
df.assign(less_than_ten=df.second_column.map(m) + df.third_column.le(10)) 

    first_column second_column third_column less_than_ten 
0  item1   cat1    5    1 
1  item2   cat1    1    1 
2  item3   cat1    8    1 
3  item4   cat2    3    3 
4  item5   cat2   731    2 
5  item6   cat2   189    2 
6  item7   cat2    9    3 
+1

감사 assign을 좋아합니다. 더 복잡한 간격을 원한다고 가정 해 봅시다. 1000 le (1000)보다 작거나 같고 20 ge (20)보다 크거나 같습니까? 어떻게이 일을 끝낼 수 있습니까? – ShanZhengYang

+0

이 경우,'pd.cut()'이 필요합니까? – ShanZhengYang