pandas按某2列进行分层随机抽样

在某些情况下,你可能需要按多列组合后的分组进行分层随机抽样。pandas 提供了灵活的数据操作方法,你可以使用 groupbyapply 方法结合 sample 来实现这种需求。具体来说,你可以先按多列分组,然后对每个分组进行随机抽样。

示例数据

首先,创建一个包含两列的数据 DataFrame:

import pandas as pd

# 创建一个示例 DataFrame
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Hannah', 
             'Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Hannah'],
    'age': [25, 30, 35, 40, 45, 50, 55, 60, 25, 30, 35, 40, 45, 50, 55, 60],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego',
             'New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego'],
    'department': ['HR', 'Finance', 'IT', 'Marketing', 'Sales', 'R&D', 'Admin', 'HR',
                   'Finance', 'IT', 'Marketing', 'Sales', 'R&D', 'Admin', 'HR', 'Finance']
}
df = pd.DataFrame(data)

print(df)
# 输出:
#        name  age         city department
# 0     Alice   25     New York         HR
# 1       Bob   30  Los Angeles    Finance
# 2   Charlie   35      Chicago         IT
# 3     David   40      Houston  Marketing
# 4       Eve   45      Phoenix      Sales
# 5     Frank   50  Philadelphia        R&D
# 6     Grace   55   San Antonio      Admin
# 7    Hannah   60     San Diego         HR
# 8     Alice   25     New York    Finance
# 9       Bob   30  Los Angeles         IT
# 10  Charlie   35      Chicago  Marketing
# 11    David   40      Houston      Sales
# 12      Eve   45      Phoenix        R&D
# 13    Frank   50  Philadelphia      Admin
# 14    Grace   55   San Antonio         HR
# 15   Hannah   60     San Diego    Finance

按两列分组并进行分层随机抽样

假设你希望按 citydepartment 列进行分组,并从每个组中随机抽取一个样本。你可以这样实现:

import pandas as pd

# 创建一个示例 DataFrame
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Hannah', 
             'Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Hannah'],
    'age': [25, 30, 35, 40, 45, 50, 55, 60, 25, 30, 35, 40, 45, 50, 55, 60],
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego',
             'New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'Philadelphia', 'San Antonio', 'San Diego'],
    'department': ['HR', 'Finance', 'IT', 'Marketing', 'Sales', 'R&D', 'Admin', 'HR',
                   'Finance', 'IT', 'Marketing', 'Sales', 'R&D', 'Admin', 'HR', 'Finance']
}
df = pd.DataFrame(data)

print(df)
# 按 'city' 和 'department' 列分组,并对每个分组随机抽取 1 行
sampled_df = df.groupby(['city', 'department']).apply(lambda x: x.sample(n=1, random_state=42)).reset_index(drop=True)

print(sampled_df)

具体步骤说明

  1. 按多列进行分组:使用 groupby(['city', 'department']) 按 city 和 department 两列进行分组。
  2. 对每个分组随机抽样:使用 apply 和 lambda 函数对每个分组调用 sample(n=1) 随机抽取一行。random_state 参数用于设置随机种子,以确保结果可重现。
  3. 重置索引:使用 reset_index(drop=True) 重置索引,以避免保留分组键的索引信息。

输出示例

根据样本数据的不同,输出可能会有所差异。以下是一个可能的输出示例:

       name  age         city department
0     Alice   25  Los Angeles    Finance
1    Charlie   35      Chicago         IT
2     Frank   50  Philadelphia        R&D
3     Hannah   60     San Diego    Finance
4       Bob   30      Houston  Marketing
5     Grace   55   San Antonio         HR
6     Alice   25     New York         HR
7       Eve   45      Phoenix      Sales
8     David   40      Houston      Sales
9    Charlie   35      Chicago  Marketing
10    Hannah   60     San Diego         HR
11    Grace   55   San Antonio      Admin
12      Bob   30  Los Angeles         IT
13    David   40     New York    Finance
14     Eve   45      Phoenix        R&D
15    Frank   50  Philadelphia      Admin

这样,你可以轻松地对 DataFrame 中的多列进行分组,并从每个分组中进行分层随机抽样。这种技术在数据分析和机器学习中非常有用,可以帮助你从大数据集中获得具有代表性的小样本进行分析。

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值