2017-10-08 13 views
1

私は頻度に基づいて分類したいシティー名のリストを持っています。私は最初にビンニングを使いたいと思っていましたが、これは単調な間隔が必要なので、私はそれをあきらめました。次の、おそらくより良いアプローチは、pandas.qcutを使用して周波数に基づく分位数に基づいてカテゴリを作成することです。しかし、分位数を持つので、私は分数に基づいて追加の列を作成する方法がわかりません。例:頻度に基づいてテキスト列を分類する方法

import numpy as np 
import pandas as pd 

np.random.seed(0) 
cities = np.random.choice(['Ontario', 'Ottawa', 'Vancouver','Edmonton', 
          'Winnipeg', 'Churchill'], 500) 
# Create fake data and their frequencies 
df = pd.DataFrame (cities, columns=['City']) 
freq = df['City'].value_counts() 
print (freq) 
# Create quantiles 
qc = pd.qcut (freq, 3) 
print (qc) 
# And now? I have the quantiles but how to assign a categorie to each City? 
category_for_each_city = df['City'] in qC# does not work, but many other things neither 

私は多くのことを試しましたが、どれもうまくいきませんでした。私はこのためのループを書くことができるはずですが、私はそれがPythonの方法であるとは想像できません。私はいくつかのSklearnトランスフォーマーを探してみましたが、この特定のソリューションでは何も見つかりませんでした。どんな助けでも大歓迎です。

さらに、私は多くの偏りのある分布を持っています。たとえば、ログ変換などの拡張が可能なソリューションは大きな助けになります。

答えて

1

あなたはほとんどありました...

In [106]: category_for_each_city = df['City'].map(qc) 

In [107]: category_for_each_city 
Out[107]: 
0  (77.333, 84.667] 
1  (72.999, 77.333] 
2  (84.667, 100.0] 
3  (84.667, 100.0] 
4  (84.667, 100.0] 
5  (84.667, 100.0] 
6  (77.333, 84.667] 
      ... 
493  (84.667, 100.0] 
494 (72.999, 77.333] 
495 (77.333, 84.667] 
496  (84.667, 100.0] 
497 (77.333, 84.667] 
498 (77.333, 84.667] 
499 (77.333, 84.667] 
Name: City, Length: 500, dtype: category 
Categories (3, interval[float64]): [(72.999, 77.333] < (77.333, 84.667] < (84.667, 100.0]] 

UPDATE:

In [114]: qc = pd.qcut (freq, 3, labels=[0,1,2]) 

In [115]: category_for_each_city = df['City'].map(qc) 

In [116]: category_for_each_city 
Out[116]: 
0  1 
1  0 
2  2 
3  2 
4  2 
5  2 
6  1 
     .. 
493 2 
494 0 
495 1 
496 2 
497 1 
498 1 
499 1 
Name: City, Length: 500, dtype: category 
Categories (3, int64): [0 < 1 < 2] 
+0

これは確かに簡単です。私は 'qc.category_for_each_city.codes [df ['City']]'のようなものを試していましたが、あなたのソリューションはずっと簡単です。あなたの助けをありがとう! – Arnold

関連する問題