pandasによるデータの離散化

1998 ワード

実際の作業シーンでは、いくつかのフィールドを離散化してバケツを分けたい、簡単に言えば年齢をいくつかの区間に分けるシーンによく遭遇します.pandasにおけるcut法は,この操作をうまく行うことができる.
#     ,      
import pandas as pd 
import numpy as np

index = pd.Index(data=["Tom", "Bob", "Mary", "James"], name="name")
data = {
    "age": [15, 28, 23, 37],
    "city": ["Hangzhou", "ShangHai", "Hefei", "Luan"],
    "sex": ["male", "female", "female", "male"]
}
user_info = pd.DataFrame(data=data, index=index)

In [48]:user_info
Out[48]: 
       age      city     sex
name                        
Tom     15  Hangzhou    male
Bob     28  ShangHai  female
Mary    23     Hefei  female
James   37      Luan    male

# user_info  age       
pd.cut(user_info.age,3)

Out[51]: 
name
Tom      (14.978, 22.333]
Bob      (22.333, 29.667]
Mary     (22.333, 29.667]
James      (29.667, 37.0]
Name: age, dtype: category
Categories (3, interval[float64]): [(14.978, 22.333] < (22.333, 29.667] < (29.667, 37.0]]

以上の結果から,cutは年齢層を均等に切り分けたことが分かる.もちろん、カスタム操作もできます(区間名に別名を付けることができます):
#          
qujian=[5,15,25,40]
pd.cut(user_info.age,qujian)

Out[55]: 
name
Tom       (5, 15]
Bob      (25, 40]
Mary     (15, 25]
James    (25, 40]
Name: age, dtype: category
Categories (3, interval[int64]): [(5, 15] < (15, 25] < (25, 40]]

#   
pd.cut(user_info.age,qujian,labels=['child','youth','middle'])
Out[56]: 
name
Tom       child
Bob      middle
Mary      youth
James    middle
Name: age, dtype: category
Categories (3, object): [child < youth < middle]

現在、区間ごとにmaleとfemaleが現れる回数を求めたい場合は、どうすればいいのでしょうか.groupby関数と組み合わせて、次のように操作できます.
#   user_info    
pdd=pd.cut(user_info['age'],qujian)
user_info['age'].groupby(pdd).count()
Out[66]: 
age
(5, 15]     1
(15, 25]    1
(25, 40]    2
Name: age, dtype: int64

以上から,age区間出現回数の統計を実現することが分かる.