基于Pandas中的条件动态更新行值

3lxsmp7m  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在运行一个模拟测试,希望根据特定的一组条件动态更改行中每列的某些值

    • 问题陈述**

1.我的数据集有400行,我的第一个测试用例是更新每列中5%的行,因此400的5% = 20行需要更新
1.这20行应该只更新前5个类别,目前在我的数据集。因此,4行,每一个需要更新
我的 Dataframe 如下所示:

A     B     C    D      Category
1     10    3    4      X
4     9     6    9      Y
9     3     7    10     XX
10    1     9    7      YY
10    1     9    7      ZZ
10    1     9    7      YZZ
10    1     9    7      YZZ
10    1     9    7      YYYY
                        ......400 rows
    • 条件为:**

1.在更新行时,我希望确保20行(整个数据集的5%)只在遇到前5个类别时才更新。在我的示例中,前5个类别是X, Y , XX, YY and ZZ。这些行应更新为值7,而以前的值是1、2、3、4、5、6
生成的 Dataframe 应如下所示:

A     B     C    D      Category
7     10    7    7      X
7     9     7    9      Y
9     7     7    10     XX
10    7     9    7      YY
10    7     9    7      ZZ
10    1     9    7      YZZ
10    1     9    7      YZZ
10    1     9    7      YYYY
                        ......400 rows

在结果 Dataframe 中,对不是前5个类别的类别没有影响,本例为YZZ or YYYY,为了演示示例,我不能显示所有更新的行,但例如在上述 Dataframe 中,A列的2行已更新,其中先前值〈= 6,变为新值7,类似地,只要满足条件,其他两行将更新为7。
我怎样才能做到这一点?

bgtovc5b

bgtovc5b1#

你可以试试下面的逻辑:

# get only desired Categories
m = df['Category'].isin(['X', 'Y', 'XX', 'YY', 'ZZ'])

# select 20 random rows from the above 
idx = df[m].sample(n=20).index

# replace the 1 ≤ values ≤ 6 by 7
df.loc[idx] = df.loc[idx].mask(df.loc[idx].ge(1)&df.loc[idx].le(6), 7)

如果您希望每个类别4行,请使用此变量进行随机抽样:

idx = df[m].groupby('Category').sample(n=4).index

相关问题