2016-10-16 9 views
2

값이 다른 클래스를 나타내는 데이터 프레임이 있습니다. 예를 들면 :팬더 데이터 프레임의 구성원 수가 적은 그룹의 값 변경

df=pd.DataFrame(
{'label':['a','a','b','a','b','b','a','c','c','d','e','c'], 
'date':[1,2,3,4,3,7,12,18,11,2,5,3],'value':np.random.randn(12)}) 

나는 '제로'예로 레이블을 특정 임계 값보다 작 values_counts와 레이블을 선택한 다음 즉, 하나 개의 클래스에 넣어 싶습니다.

value_count=df.label.value_counts() 
threshold = 3 
for index in value_count[value_count.values<=threshold].index: 
    df.label[df.label==index]='zero' 

이 작업을 수행 할 수있는 더 나은 방법이 있나요 :

이 내이 시도인가?

답변

2

당신은 부울 지표로 사용 후, 원래의 인덱스와 정렬 된 값의 수를 얻을 수 groupby.transform를 사용할 수 있습니다 여기에

df.loc[df.groupby('label')['label'].transform('count') <= threshold, 'label'] = 'zero' 

df 
Out: 
    date label  value 
0  1  a -0.587957 
1  2  a 0.341551 
2  3 zero 0.516933 
3  4  a 0.234042 
4  3 zero -0.206185 
5  7 zero 0.840724 
6  12  a -0.728868 
7  18 zero 0.111260 
8  11 zero -0.471337 
9  2 zero 0.030803 
10  5 zero 1.012638 
11  3 zero -1.233750 

내 타이밍은 다음과 같습니다

df = pd.concat([df]*10**4) 

%timeit df.groupby('label')['label'].transform('count') <= threshold 
100 loops, best of 3: 7.86 ms per loop 

%%timeit 
value_count=df.label.value_counts() 
df['label'].isin(value_count[value_count.values<=threshold].index) 
100 loops, best of 3: 9.24 ms per loop 
+0

엄만, 벤치 마크를 업데이트했습니다. 그러나 나는 당신의 해결책을 좋아합니다. :-) – Zero

+0

@JohnGalt, "timeit"을 잊지 마세요. : value_count = df.label.value_counts()';) – MaxU

+0

네, 이제 이해가됩니다. 감사. – Zero

1

당신은 할 수 할

In [59]: df.loc[df['label'].isin(value_count[value_count.values<=threshold].index), 
'label'] = 'zero' 

In [60]: df 
Out[60]: 
    date label  value 
0  1  a -0.132887 
1  2  a -1.306601 
2  3 zero -1.431952 
3  4  a 0.928743 
4  3 zero 0.278955 
5  7 zero 0.128430 
6  12  a 0.200825 
7  18 zero -0.560548 
8  11 zero -2.925706 
9  2 zero -0.061373 
10  5 zero -0.632036 
11  3 zero -1.061894 

타이밍

In [87]: df = pd.concat([df]*10**4, ignore_index=True) 

In [88]: %timeit df['label'].isin(value_count[value_count.values<=threshold].index) 
100 loops, best of 3: 7.1 ms per loop 

In [89]: %timeit df.groupby('label')['label'].transform('count') <= threshold 
100 loops, best of 3: 11.7 ms per loop 

In [90]: df.shape 
Out[90]: (120000, 3) 

큰 데이터 세트로 벤치마킹 할 수 있습니다. 그리고, 이것은 당신이 미리 컴파일하기 때문에 비교하기에 정확하지 않을 수도 있습니다. value_count

관련 문제