2 回答

TA貢獻(xiàn)1811條經(jīng)驗 獲得超6個贊
使用Pandas時,應(yīng)避免按行操作,因為這些操作通常涉及效率低下的Python級循環(huán)。這里有兩個選擇。
熊貓: pd.cut
正如@JonClements所建議的,您可以使用pd.cut它,這里的好處是您的新列將成為Categorical。
您只需要定義邊界(包括np.inf)和類別名稱,然后將其應(yīng)用于pd.cut所需的數(shù)字列即可。
bins = [0, 2, 18, 35, 65, np.inf]
names = ['<2', '2-18', '18-35', '35-65', '65+']
df['AgeRange'] = pd.cut(df['Age'], bins, labels=names)
print(df.dtypes)
# Age int64
# Age_units object
# AgeRange category
# dtype: object
NumPy: np.digitize
np.digitize提供另一種干凈的解決方案。這個想法是定義邊界和名稱,創(chuàng)建字典,然后應(yīng)用于“ np.digitize年齡”列。最后,使用字典來映射類別名稱。
請注意,對于邊界情況,下限用于映射到bin。
import pandas as pd, numpy as np
df = pd.DataFrame({'Age': [99, 53, 71, 84, 84],
'Age_units': ['Y', 'Y', 'Y', 'Y', 'Y']})
bins = [0, 2, 18, 35, 65]
names = ['<2', '2-18', '18-35', '35-65', '65+']
d = dict(enumerate(names, 1))
df['AgeRange'] = np.vectorize(d.get)(np.digitize(df['Age'], bins))
結(jié)果
Age Age_units AgeRange
0 99 Y 65+
1 53 Y 35-65
2 71 Y 65+
3 84 Y 65+
4 84 Y 65+

TA貢獻(xiàn)1853條經(jīng)驗 獲得超9個贊
這是BRILLIANT!感謝您為提供這樣清晰而周到的響應(yīng)而付出的麻煩,并且添加垃圾桶/熊貓切割方法的細(xì)節(jié)是錦上添花的完美方法。這是最簡單最優(yōu)雅的方法,我當(dāng)然會使用它,謝謝。我在所有關(guān)于Bins的工作中都看過某個地方-但還沒有弄清楚如何應(yīng)用它,當(dāng)然也不知道它會多么容易!再次感謝
添加回答
舉報