【问题标题】:Iterating over unique values for auditing purposes?为审计目的迭代唯一值?
【发布时间】:2020-07-22 08:26:00
【问题描述】:

假设我们在数据框 df2 中有一个独特类别的列表:

categories = df2['Category'].unique()

我想遍历 df2 中的每个类别,将其与上面的变量类别匹配,并应用 lambda 函数。语法是什么?

我尝试了以下方法:

df2.loc[df2.Category == categories, :].apply(lambda x: x.sample(n=3) if 
x.size*0.01 < 3 else x.sample(frac=0.01))

大概,上面的代码应该遍历类别中的每个类别并带回该类别中的所有项目,对吧?还是我错过了什么?我得到的错误如下:

ValueError: Lengths must match to compare. 

我认为,我遇到的错误是因为 df.Category 比类别长,因为 df.Category 是所有类别的列表,它们是重复的,这就是我尝试 .unique() 的原因。有没有办法解决这个问题,所以我的代码可以工作?感谢您的时间。

【问题讨论】:

  • df2['Category'].unique() 是一个您可能需要使用isin 的列表,但理论上df2['Category] 中的每个值都会返回True...
  • 你的预期输出是什么?
  • 我试图从数据帧中的每个类别中抽取样本,而不是从整个数据帧中抽取样本。

标签: python pandas


【解决方案1】:

这是我的建议:

# I reproduce the dataset
import pandas as pd
import numpy as np
np.random.seed(123)
df1 = pd.DataFrame({"Category": np.arange(0, 20).repeat(5),
                   "value": np.random.random(20*5)})
df2 = pd.DataFrame({"Category": np.arange(20, 40).repeat(500),
                   "value": np.random.random(20*500)})
df = pd.concat([df1,df2]) # I concat these two to get varying category sizes


df2 = (df.groupby("Category").apply(lambda x: x.sample(n=3) if x.size*0.01 < 3 
                                                            else x.sample(frac=0.01))
                             .drop(columns="Category"))

您会看到,您获得了一个多索引,其中包含 Category 以及每个类别的样本中的观察索引。对于从 0 到 19 的类别,您有 3 个样本,对于上述类别,您有 5 个样本。

               value
Category            
0        1  0.286139
         4  0.719469
         2  0.226851
1        9  0.392118
         7  0.684830

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 2022-01-21
    • 2020-04-28
    • 2022-08-24
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2013-02-09
    • 2019-01-03
    相关资源
    最近更新 更多