如何根据另一列的值计数从 Pandas Dataframe 中采样数据

How to sample data from Pandas Dataframe based on value count from another column

我有一个包含大约 400,000 个观察值的数据框。我想根据 'state' 列中每个州的数量对 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`

有没有其他方法可以做到这一点?

您可以使用 groupby.sample:

df.groupby('state').sample(frac=0.125, random_state=101)

weights 参数与组不同,它期望数字列表作为样本概率,当您希望对不同行进行非等概率加权时使用。

例如,以下 sample 将始终 return 来自前两行的数据框,因为最后两行的权重为 0,并且永远不会被选中:

df = pd.DataFrame({'a': [1,2,3,4]})
df.sample(n=2, weights=[0.5,0.5,0,0])
   a
0  1
1  2

权重修改任何一行被选中的概率,但不能如您所愿地对给定值的计数提供严格保证。为此你需要 .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 提供的更有效的答案稍微灵活一些。