我想知道使用比例分配方法从每个级别采集多少样本。
我总共有三个级别:[小,中,大]。
首先,我想为这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照片
在第一步中:我想获得级别的总和值 - >小,中,高。即(10 + 32 + 34 + 42)= 118为小等级。
在下一步中,我想找出每个级别以2位小数舍入的概率。 即(118/786)= 0.15为小水平。
使用每个级别的长度(大小)乘以概率,以找出从每个级别获取的样本(村)的数量。
即中等水平,概率为0.25,我们有3个中等水平的村庄。因此,0.25 * 3 = 0.75将从中等水平取样。 因此,它将从中等水平舍入到下一个整数0.75~1个样本,它将占据该级别的顶级村庄。所以,在中等水平" Dhokri"村将被选中,
我做了一些工作,
transitionEnter
我使用此命令获取等级的总和。接下来做什么我很困惑,
DF = df.groupby(['电平'])['工人&#39]。集合体(['和'])。拆散()
是否有可能在python中获取使用excel时得到的村名?
答案 0 :(得分:0)
您可以使用:
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('')