如何根据另一列的值计数从 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 提供的更有效的答案稍微灵活一些。
我有一个包含大约 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 提供的更有效的答案稍微灵活一些。