我正在使用人口普查收入資料集。您可以在“資料檔案夾”中找到資料集檔案 Adult.data。
為了快速重現問題,這里是如何加載它:
training_df = pd.read_csv('adult.data', header = None, skipinitialspace = True)
columns = ['age','workclass','fnlwgt','education','education-num','marital-status',
'occupation','relationship','race','sex','capital-gain','capital-loss',
'hours-per-week','native-country','income']
training_df.columns = columns
我正在嘗試使用一個簡單的比率找出每個 native_country 的收入不平衡:
收入不平衡=收入<=50K的人口/收入>50K的人口
這是我最天真的、非 Pythonic 和非 Pandas 的方法:
def native_country_income_imbalance():
income_dict = {}
for index, data in training_df.iterrows():
native_country = data['native-country']
income = data['income']
# 1st number will store count of >50K and second <=50K
income_count = [0,0]
if not income_dict.get(native_country, False):
if income == '>50K':
income_count[0] = 1
income_dict[native_country] = income_count
else:
income_count[1] = 1
income_dict[native_country] = income_count
else:
if income == '>50K':
income_dict[native_country][0] = 1
else:
income_dict[native_country][1] = 1
for country, incomes in income_dict.items():
# For a native_country where there is no one with >50K
# income, we'll make proportion 0 as a special case
if incomes[0] != 0:
proportion = round(incomes[1] / incomes[0], 2)
else:
proportion = 0
income_dict[country] = proportion
income_dict = dict(sorted(income_dict.items(), key=lambda item: item[1],reverse=True))
return income_dict
呼叫函式
native_country_income_imbalance()
正確回傳輸出為
{'Dominican-Republic': 34.0,
'Columbia': 28.5,
'Guatemala': 20.33,
'Mexico': 18.48,
'Honduras': 12.0,
.
.
'Taiwan': 1.55,
'India': 1.5,
'France': 1.42,
'Iran': 1.39,
'Outlying-US(Guam-USVI-etc)': 0,
'Holand-Netherlands': 0}
這顯然是冗長的,而不是利用 Pandas 的真正力量(矢量化 groupby 變換)。我該如何改進?
注意:請隨時改進問題標題。
uj5u.com熱心網友回復:
熊貓解決方案
創建一個頻率表crosstab,然后屏蔽計數為零的值,然后使用 eval 除以<=50K列>50K來計算比率
s = pd.crosstab(df['native-country'], df['income'])
result = s[s != 0].eval('`<=50K` / `>50K`').fillna(0)
result = result.round(decimals = 2)
result = result.sort_values(ascending=False)
result
native-country
Dominican-Republic 34.00
Columbia 28.50
Guatemala 20.33
Mexico 18.48
Nicaragua 16.00
.
.
India 1.50
France 1.42
Iran 1.39
Outlying-US(Guam-USVI-etc) 0.00
Holand-Netherlands 0.00
dtype: float64
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/497797.html
標籤:Python 熊猫 麻木的 熊猫-groupby 数据操作
下一篇:總和超過閾值的最小區間
