首页 > 解决方案 > 熊猫:从每行的随机列中选择值

问题描述

假设我有以下 Pandas DataFrame:

df = pd.DataFrame({
    'a': [1, 2, 3],
    'b': [4, 5, 6],
    'c': [7, 8, 9]
})
    a   b   c
0   1   4   7
1   2   5   8
2   3   6   9

我想生成一个新pandas.Series的,以便从 DataFrame 中的随机列中逐行选择该系列的值。因此,可能的输出将是系列:

0    7
1    2
2    9
dtype: int64

(在第 0 行中它随机选择了“c”,在第 1 行中它随机选择了“a”,在第 2 行中它再次随机选择了“c”)。

我知道这可以通过遍历行并使用random.choice来选择每一行来完成,但是遍历行不仅性能不佳,而且可以说是“unpandonic”。此外, df.sample(axis=1) 将选择整个列,因此所有列都将从同一列中选择,这不是我想要的。有没有更好的方法来使用矢量化 pandas 方法来做到这一点?

标签: pythonpandasdataframerandom

解决方案


这是一个完全矢量化的解决方案。但是请注意,它不使用 Pandas 方法,而是涉及对底层 numpy 数组的操作。

import numpy as np

indices = np.random.choice(np.arange(len(df.columns)), len(df), replace=True)

示例输出[1, 2, 1]对应于['b', 'c', 'b'].

然后使用它来切片 numpy 数组:

df['random'] = df.to_numpy()[np.arange(len(df)), indices]

结果:

   a  b  c  random
0  1  4  7       7
1  2  5  8       5
2  3  6  9       9

推荐阅读