【问题标题】:Using Pandas & Pivot table how to use column(level) groupby sum values for the next steps analysis?使用 Pandas & Pivot table 如何使用 column(level) groupby sum 值进行下一步分析?
【发布时间】:2017-05-31 11:12:36
【问题描述】:

我想知道使用比例分配方法从每个级别中抽取多少样本。

我总共有 3 个级别:[小、中、大]。

首先,我想为这 3 个级别的总和。

接下来,我想找出这 3 个级别的概率

接下来,我想用这个概率答案乘以这 3 个级别给出的样本数

最后一步是:样本将被选为每个级别的顶级村庄。

数据:

Village     Workers       Level
Aagar       10            Small
Dhagewadi   32            Small
Sherewadi   34            Small
Shindwad    42            Small
Dhokari     84            Medium
Khanapur    65            Medium
Ambikanagar 45            Medium
Takali      127           Large
Gardhani    122           Large
Pi.Khand    120           Large
Pangri      105           Large

让我解释一下,我附上excel照片

第一步:我想获取级别的总和值 -> 小、中和高。即 (10+32+34+42)=118 用于小级别。

在下一步中,我想找出以小数点 2 舍入的每个级别的概率。 即 (118/786) =0.15 用于小级别。

并使用每个级别的长度(大小)乘以概率来找出从每个级别中抽取的样本(村庄)的数量。

即对于中等级别,我们有 0.25 的概率,我们有 3 个中等级别的村庄。因此,0.25*3 = 0.75 将从中等水平取样。 因此,它会四舍五入到下一个整数 0.75 ~ 1 取自 Medium 级别的样本,并且会取该级别的顶级村庄。所以,在中等水平的“Dhokri”村将被选中,

我做了一些工作,

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df=pd.read_csv("/home/desktop/Desktop/t.csv")
df = df.sort('Workers', ascending=True)            
df['level'] = pd.qcut(df['Workers'], 3, ['Small','Medium','Large'])
df

我正在使用这个命令来获取级别的总和。接下来该怎么办,我很困惑,

df=df.groupby(['level'])['Workers'].aggregate(['sum']).unstack()

是否有可能在 python 中获得我在使用 excel 中得到的那个村庄名称?

【问题讨论】:

    标签: python pandas numpy pivot


    【解决方案1】:

    你可以使用:

    • transformsum 的列长度相同
    • 除以divsumround
    • 另一个transformsize
    • 最后一个自定义函数

    df['Sum_Level_wise'] = df.groupby('Level')['Workers'].transform('sum')
    df['Probability'] = df['Sum_Level_wise'].div(df['Workers'].sum()).round(2)
    df['Sample'] = df['Probability'] * df.groupby('Level')['Workers'].transform('size')
    df['Selected villages'] = df['Sample'].apply(np.ceil).astype(int)
    
    df['Selected village'] = df.groupby('Level')
                               .apply(lambda x: x['Village'].head(x['Selected villages'].iat[0]))
                               .reset_index(level=0)['Village']
    df['Selected village'] = df['Selected village'].fillna('')
    print (df)
            Village  Workers   Level  Sum_Level_wise  Probability  Sample  \
    0         Aagar       10   Small             118         0.15    0.60   
    1     Dhagewadi       32   Small             118         0.15    0.60   
    2     Sherewadi       34   Small             118         0.15    0.60   
    3      Shindwad       42   Small             118         0.15    0.60   
    4       Dhokari       84  Medium             194         0.25    0.75   
    5      Khanapur       65  Medium             194         0.25    0.75   
    6   Ambikanagar       45  Medium             194         0.25    0.75   
    7        Takali      127   Large             474         0.60    2.40   
    8      Gardhani      122   Large             474         0.60    2.40   
    9      Pi.Khand      120   Large             474         0.60    2.40   
    10       Pangri      105   Large             474         0.60    2.40   
    
        Selected villages Selected village  
    0                   1            Aagar  
    1                   1                   
    2                   1                   
    3                   1                   
    4                   1          Dhokari  
    5                   1                   
    6                   1                   
    7                   3           Takali  
    8                   3         Gardhani  
    9                   3         Pi.Khand  
    10                  3                 
    

    您可以尝试使用自定义函数进行调试:

    def f(x):
        a = x['Village'].head(x['Selected villages'].iat[0])
        print (x['Village'])
        print (a)
        if (len(x) < len(a)):
            print ('original village cannot be filled to Selected village, because length is higher')
        return a
    
    df['Selected village'] = df.groupby('Level').apply(f).reset_index(level=0)['Village']
    df['Selected village'] = df['Selected village'].fillna('')
    

    【讨论】:

    • 不,我认为没有。
    • 有一个例外,如果有 MultiIndex 则所有列都连接在一起,但在您的数据中这是不可能的。
    • 我认为数据有问题,请稍等,我编辑答案。
    • 太棒了,希望尽快找到问题。 ;)
    • 真正有问题的帮助你,因为从不生成pdf :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2013-08-26
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多