使用Pandas数据框如何使用多个条件随机选择行数据

时间:2019-11-19 12:34:32

标签: python pandas random

我有一个数据集,列为NDVI,纬度,经度,小组,村庄和塔卢卡。

我想在每个taluka中随机选择10个村庄,并且每10个村庄随机选择5行数据。但我坚持选择随机函数。因此,在taluka(块)中,我想选择50个数据值,但有条件的是选择10个村庄,并且每个村庄至少要有5个条目,并基于“组”列,“概率概率”选择5个点。如果XYZ村在“非常贫困”中的面积为70%”,则将选择n = 5 * 0.70 = 3.5样本= 4(四舍五入),因此将为该村选择4个数据行。如果XYZ村的面积为30%组中的“好”区域,则将随机选择n = 5 * 0.30 = 1.5 = 2(四舍五入)

import pandas as pd
import numpy as np
df=pd.read_excel("/home/desktop/Music/Data-Balaghat.xlsx")
def f(x):
    x['No.of Points'] = x.groupby(['Village'])['NDVI'].transform('count')
    x['No.of Points'] = x['No.of Points'].fillna('')
    return x

df1 = df.groupby(['Taluka','Group']).apply(f)
df1 = df.groupby(['Taluka','Village']).apply(f)
sample=df1.loc[df1['No.of Points'] >= 5]
def f(x):
    labels = ['Very Poor','Poor','Average','Good']
    x = x.sort_values('Village','NDVI', ascending=False)
    x['Level'] = pd.qcut(x['NDVI'], 4, labels = labels)
    x['Sum_Level_wise'] = x.groupby(['Village','Level'])['NDVI'].transform('sum')
    x['Probability'] = x['Sum_Level_wise'].div(x['NDVI'].sum()).round(2)
    x['Sample'] = x['Probability'] * x.groupby('Level')['NDVI'].transform('size')
    x['Selected villages'] = x['Sample'].apply(np.ceil).astype(int)
    x['Selected village'] = x.groupby('Level').apply(lambda x: x['Village'].head(x['Selected villages'].iat[0])).reset_index(level=0)['Village']
    x['Selected village'] = x['Selected village'].fillna('')
    return x

df1 = df.groupby(['Taluka','Village']).apply(f)
df1['Selected village'].replace('', pd.np.nan, inplace=True)
df1.dropna(subset=['Selected village'], inplace=True)

Data set

1 个答案:

答案 0 :(得分:1)

这是一个多步骤的过程。

首先,我想与您分享这些文档:

pandas.DataFrame.sample: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sample.html

random.choice(seq):https://docs.python.org/3/library/random.html

它应该适合您的抽样问题。

然后分解您的问题。

  

我想在每个taluka中随机选择10个村庄

获取每个taluka中村庄的唯一列表,创建遍历taluka值的子集。一旦获得唯一列表,请对每个列表应用random.choice,以获取所选的村庄价值。

仅使用选定的值创建新的DataFrame以获得更高的可见性,而过程则不需要。

  

每10个村庄随机选择5个行数据

遍历塔卢卡斯和选定的独特村庄,并应用pandas.DataFrame.sample,每次选择5行。

再次保存新的DataFrame以提高可见性

  

如果XYZ村在非常贫困地区的面积为70%”,则将选择n = 5 * 0.70 = 3.5样本= 4(四舍五入),因此将为该村选择4个数据行。如果XYZ村组:“好”中有30%的面积,则将随机选择n = 5 * 0.30 = 1.5 = 2(四舍五入)

这完全是关于规则的,只是在数据框的新列中计算所需的指标。

根据您计算出的指标值,再次使用右边的n运行pandas.DataFrame.sample函数(您也可以将其添加到DataFrame中,这完全取决于您,并且您会保持跟踪)。