首页 > 解决方案 > pandas 中的按列采样

问题描述

我有以下数据框:

df = pd.DataFrame(
    dict(
        A=[0, 0, 0.5, 0.6],
        B=[0, 0.7, 0.1, 0],
        C=[1, 0.3, 0.4, 0.4],
    )
)

我想要一个返回数组/列表的采样方法,例如:

['C', 'B', 'C', 'A']

具有以下属性:

有没有一种简单的方法可以在 python 中做到这一点?

标签: pythonpandas

解决方案


您可以尝试生成一个随机数组,然后比较沿行的累积分布,最后使用idxmax

s = np.random.rand(len(df))
df.cumsum(1).gt(s[:,None]).idxmax(1)

测试方法:

counts = 0

for _ in range(1000):
    s = np.random.rand(len(df))
    sample = df.cumsum(1).gt(s[:,None]).idxmax(1)
    counts = pd.crosstab(sample.index, sample).add(counts, fill_value=0)

输出(接近原始数据框):

col_0      A      B     C
row_0                    
0        0.0    0.0  1000
1        0.0  688.0   312
2      514.0   96.0   390
3      601.0    0.0   399

推荐阅读