Pandas嵌套DataFrame分配

时间:2017-09-23 22:27:46

标签: python-2.7 pandas dataframe

我有以下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时我出错了什么?

1 个答案:

答案 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。