Sto*_*ssa 5 python random dataframe python-3.x pandas-groupby
我有一个带有类别列的数据框。Df 对每个类别有不同的行数。
category number_of_rows
cat1 19189
cat2 13193
cat3 4500
cat4 1914
cat5 568
cat6 473
cat7 216
cat8 206
cat9 197
cat10 147
cat11 130
cat12 49
cat13 38
cat14 35
cat15 35
cat16 30
cat17 29
cat18 9
cat19 4
cat20 4
cat21 1
cat22 1
cat23 1
Run Code Online (Sandbox Code Playgroud)
我想从每个类别中选择不同数量的行。(而不是每个类别的 n 个固定行数)
Example input:
size_1 : {"cat1": 40, "cat2": 20, "cat3": 15, "cat4": 11, ...}
Example input:
size_2 : {"cat1": 51, "cat2": 42, "cat3": 18, "cat4": 21, ...}
Run Code Online (Sandbox Code Playgroud)
我想要做的实际上是一个分层抽样,给定数量的实例对应于每个类别。
此外,它应该是随机选择的。例如,我不需要 size_1.["cat1"] 的前 40 个值,我需要随机的 40 个值。
谢谢您的帮助。
我们先生成一些数据,看看如何解决问题:
# Define a DataFrame containing employee data
df = pd.DataFrame({'Category':['Jai', 'Jai', 'Jai', 'Princi', 'Princi'],
'Age':[27, 24, 22, 32, 15],
'Address':['Delhi', 'Kanpur', 'Allahabad', 'Kannauj', 'Noida'],
'Qualification':['Msc', 'MA', 'MCA', 'Phd', '10th']} )
Run Code Online (Sandbox Code Playgroud)
# Number of rows, that we want to be sampled from each category
samples_per_group_dict = {'Jai': 1,
'Princi':2}
Run Code Online (Sandbox Code Playgroud)
我可以提出两种解决方案:
在 groupby 上申请(单行)
output = df.groupby('Category').apply(lambda group: group.sample(samples_per_group_dict[group.name])).reset_index(drop = True)
Run Code Online (Sandbox Code Playgroud)
循环组(更详细)
list_of_sampled_groups = []
for name, group in df.groupby('Category'):
n_rows_to_sample = samples_per_group_dict[name]
sampled_group = group.sample(n_rows_to_sample)
list_of_sampled_groups.append(sampled_group)
output = pd.concat(list_of_sampled_groups).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)
两种方法的性能应该相同。如果性能很重要,您可以矢量化您的计算。但精确的优化取决于每组中的 n_groups 和 n_samples。
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |