我有以下DataFrame:
prefix operator_name country_name mno_subscribers
0 267.0 Airtel Botswana 490
1 373.0 Orange Moldova 207
2 248.0 Airtel Seychelles 490
3 91.0 Reliance Bostwana 92
4 233.0 Vodafone Bostwana 516
我试图实现这个目标:
prefix operator_name country_name mno_subscribers operator_proba
0 267.0 Airtel Botswana 490 0.045
1 373.0 Orange Moldova 207 0.004
2 248.0 Airtel Seychelles 490 0.135
3 91.0 Reliance India 92 0.945
4 233.0 Vodafone Ghana 516 0.002
有了这个:
countries = df["country_name"].unique()
df["operator_proba"] = 0
for country in countries:
country_name = df[df["country_name"] == country]
for operator in country:
mno_sum = country_name["mno_subscribers"].sum()
df["operator_proba"]["country_name"] = country_name["mno_subscribers"] / mno_sum
在将operator_proba
分配给原始DataFrame时我出错了什么?
答案 0 :(得分:1)
这一行
df["operator_proba"]["country_name"] = country_name["mno_subscribers"] / mno_sum
无法正常工作,因为df["operator_proba"]
是一个列(或系列);你不能使用["country_name"]
索引。
这可能就是为什么事情不适合你。
目前还不完全清楚你想要达到的目标,但我想这可行:
df['operator_proba'] = df.groupby('country_name')['mno_subscribers'].apply(lambda x : x/x.sum())
这为你节省了一个双循环,并且是更多Pandas风格(可能还有更好的计算方法)。结果是:
prefix operator_name country_name mno_subscribers operator_proba
0 267.0 Airtel Botswana 490 1.000000
1 373.0 Orange Moldova 207 1.000000
2 248.0 Airtel Seychelles 490 1.000000
3 91.0 Reliance Bostwana 92 0.151316
4 233.0 Vodafone Bostwana 516 0.848684
有限的数据集(和博茨瓦纳/博斯瓦纳的差异),大多数"概率"是1。