使用熊猫&数据透视表如何使用列(级别)groupby和值进行后续步骤分析?

时间:2017-05-31 11:12:37

标签: python pandas numpy pivot

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

我总共有三个级别:[小,中,大]。

首先,我想为这3个等级拿一笔钱。

接下来,我想找出这3个级别的可能性

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

并且,最后一步是:将选择样本作为每个级别的顶级村庄。

数据:

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

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

enter image description here

在第一步中:我想获得级别的总和值 - >小,中,高。即(10 + 32 + 34 + 42)= 118为小等级。

enter image description here

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

enter image description here

使用每个级别的长度(大小)乘以概率,以找出从每个级别获取的样本(村)的数量。

即中等水平,概率为0.25,我们有3个中等水平的村庄。因此,0.25 * 3 = 0.75将从中等水平取样。 因此,它将从中等水平舍入到下一个整数0.75~1个样本,它将占据该级别的顶级村庄。所以,在中等水平" Dhokri"村将被选中,

我做了一些工作,

transitionEnter

我使用此命令获取等级的总和。接下来做什么我很困惑,

  
    
      

DF = df.groupby(['电平'])['工人&#39]。集合体(['和'])。拆散()

    
  

是否有可能在python中获取使用excel时得到的村名?

1 个答案:

答案 0 :(得分:0)

您可以使用:

  • transformsum相同的列长度
  • sumdiv
  • 除以round
  • 其他transform size
  • 最后的自定义功能
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('')