pandasによるデータの離散化
1998 ワード
実際の作業シーンでは、いくつかのフィールドを離散化してバケツを分けたい、簡単に言えば年齢をいくつかの区間に分けるシーンによく遭遇します.pandasにおけるcut法は,この操作をうまく行うことができる.
以上の結果から,cutは年齢層を均等に切り分けたことが分かる.もちろん、カスタム操作もできます(区間名に別名を付けることができます):
現在、区間ごとにmaleとfemaleが現れる回数を求めたい場合は、どうすればいいのでしょうか.groupby関数と組み合わせて、次のように操作できます.
以上から,age区間出現回数の統計を実現することが分かる.
# ,
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区間出現回数の統計を実現することが分かる.