使用Pandas数据帧如何使用多种条件随机选择行数据

2024-07-04 16:26:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,包括NDVI、Lat、Long、Group、Village和Taluka列。你知道吗

我想在每个塔鲁卡随机选择10个村庄,每10个村庄随机选择5行数据。但我坚持选择随机函数。所以,在taluka(块)我想选择50个数据值,但有条件是选择10个村庄,每个村庄至少要5个条目,并根据“组”列,概率比例概率选择5个点。如果XYZ村有70%的面积处于“非常贫困”状态,则将选择n=5*0.70=3.5 Sample=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


Tags: of数据nodflevelpddf1apply
1条回答
网友
1楼 · 发布于 2024-07-04 16:26:06

这是一个多步骤的过程。你知道吗

首先,我想和大家分享这些文档:

你知道吗pandas.DataFrame.sample文件: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sample.html

以及

你知道吗随机选择(顺序):https://docs.python.org/3/library/random.html

它应该适合你的抽样问题。你知道吗

然后分解你的问题。你知道吗

I want to randomly select 10 villages in each taluka

获取每个taluka中村庄的唯一列表,创建循环使用taluka值的子集。一旦你得到唯一的名单申请随机选择为每个列表获取您选择的村庄值。你知道吗

创建一个新的数据帧,仅使用选定的值以获得更高的可见性,而不需要用于流程。你知道吗

and each 10 villages select 5 row data randomly

环游塔鲁卡斯和选定的独特村庄,并申请pandas.DataFrame.sample文件,每次选择5行。你知道吗

再次保存一个新的数据帧以供查看

If Village XYZ have 70% area in Very Poor" then it will be select n=5 *0.70 = 3.5 Sample = 4(rounding), so it will be 4 data rows will be select for that village. If village XYZ have 30% area in Group: "Good", then it will be randomly select n=5*0.30 =1.5 = 2 (rounding)

这里是关于规则的,只需在数据帧的新列中计算所需的指示符。你知道吗

根据计算的指标值,再次运行pandas.DataFrame.sample文件使用正确的n函数(您也可以将其添加到您的数据帧中,这完全取决于您自己,并且您愿意跟踪)。你知道吗

相关问题 更多 >

    热门问题