我有一个非常大的数据集,其 struct 类似于以下:

df = pd.DataFrame({
    'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Group': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2],
    'SampleSize': [4, 4, 4, 4, 4, 4, 1, 1, 1, 1]
})

这意味着,例如,在Group 1内,有6个不同的单位可供 Select (IDs),并且对于这个Group 1,需要 Select 4个单位来形成样本.因此,最终我想得到一个额外的列,指示随机 Select 的样本,如下所示:

df = pd.DataFrame({
    'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Group': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2],
    'SampleSize': [4, 4, 4, 4, 4, 4, 1, 1, 1, 1]
    'Sample': [0, 1, 1, 1, 0, 1, 0, 1, 0, 0]
})

我试过这样的方法:

def select_random_ids(group):
    sample_size = group['SampleSize'].iloc[0]
    selected_ids = np.random.choice(group['ID'], size=sample_size, replace=False)
    return pd.DataFrame({'ID': selected_ids})

.apply(select_random_ids)),但我不能让它工作.

推荐答案

试着:

def binary_mask_random(r, n):
    a = np.zeros(r, dtype="uint8")
    indices = np.random.choice(range(r), size=n, replace=False)
    a[indices] = 1
    return a


df["Sample"] = df.groupby("Group")["SampleSize"].transform(
    lambda size: binary_mask_random(len(size), size.iat[0])
)
print(df)

打印(例如):

   ID  Group  SampleSize  Sample
0   1      1           4       1
1   2      1           4       0
2   3      1           4       1
3   4      1           4       1
4   5      1           4       0
5   6      1           4       1
6   7      2           1       0
7   8      2           1       1
8   9      2           1       0
9  10      2           1       0

Python-3.x相关问答推荐

如何创建一个polars gramme,给出列表中的列名,

TypeError:&Quot;Value&Quot;参数必须是标量、Dict或Series,但您传递了&Quot;Index&Quot;

按小时和日期对Pandas 数据帧进行分组

Django内置注销视图`不允许的方法(GET):/USERS/LOGOUT/`

如何将多个字典合并到一个列中,并为不同的行使用相同的键

如何使用 Selenium Python 连续单击一个按钮直到另一个元素出现?

为什么 get_form 方法中小部件的更改没有反映 Django 管理站点中的更改

将 rgb numpy 图像转换为 rgb 列表和相应的索引值

如何使用 django rest 框架在 self forienkey 中删除多达 n 种类型的数据?

在字符串中查找正则表达式的所有模式

保存 StandardScaler() 模型以用于新数据集

pythondecorator中的变量范围

Python3 mysqlclient-1.3.6(又名 PyMySQL)的用法?

Python图例属性错误

如何使 Python3 成为 Geany 中的默认 Python

使用打印时,用+连接是否比用,分隔更有效?

如何将numpy数组图像转换为字节?

TypeError:只有整数标量数组可以转换为标量索引

清除 PyCharm 运行窗口

将 Python 字节转换为无符号 8 位整数