首页 > 解决方案 > 如何根据另一列的值计数从 Pandas Dataframe 中采样数据

问题描述

我有一个包含大约 400,000 个观察值的数据框。我想根据“状态”列中每个状态的数量对 50,000 个观察值进行抽样。因此,如果有 5% 的观测值来自 TX,那么 2,500 个样本应该来自 TX,依此类推。

我尝试了以下方法:

import pandas as pd
df.sample(n=50000, weights = 'state', random_state = 101)

这给了我这个错误。

TypeError: '<' not supported between instances of 'str' and 'int`

有不同的方法可以做到这一点吗?

标签: pythonpandassample

解决方案


权重会修改要选择的任何一行的概率,但不能根据需要对给定值的计数提供严格保证。为此,您需要.groupby('state')

>>> rate = df['state'].value_counts(normalize=True)
>>> rate
TX    0.5
NY    0.3
CA    0.2
>>> df.groupby('state').apply(lambda s: s.sample(int(10 * rate[s.name]))).droplevel('state')
   state  val
69    CA   33
19    CA   99
37    NY   89
36    NY   63
75    NY    3
42    TX   42
53    TX   52
50    TX   68
72    TX   70
2     TX   18

替换10为您想要的样本数,因此50_000. 这比@Psidom 更有效的答案提供了更多的灵活性。


推荐阅读