python - 如何根据另一列的值计数从 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`
有不同的方法可以做到这一点吗?
解决方案
权重会修改要选择的任何一行的概率,但不能根据需要对给定值的计数提供严格保证。为此,您需要.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 更有效的答案提供了更多的灵活性。
推荐阅读
- powershell - 在不重新启动 shell 的情况下重新加载 Powershell 类模块?
- java - Maven:“未知包装:捆绑”来自依赖包装的捆绑错误
- python - 来自python问题的exe
- java - java中如何使用Collections.sort()?
- javascript - 不同高度的定位元件
- selenium - 用于记录在浏览器中为 UI 自动化测试完成的任务的选项
- cmake - 如何在 CMake 中使用版本号和共享库后缀(.so 或 .dylib)
- json - 从 Kotlin 中的子类获取 SerializedName 参数
- html - 表格中的图像未按预期放置?
- ios - iOS 11.x 的 Cordova 中的 CSS 图像掩码损坏?