python - 熊猫:从每行的随机列中选择值
问题描述
假设我有以下 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 方法来做到这一点?
解决方案
这是一个完全矢量化的解决方案。但是请注意,它不使用 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
推荐阅读
- java - 在 Map Java 中转换嵌套的 JsonArray
- powershell-core - 没有前导 '.' 的子路径
- sql - Postgres通过排序删除所有重复记录
- api - 我使用 Python 使用/签署 AWS 产品广告 API 的最简单方法是什么?
- javascript - 解释当两种类型不相等时 JavaScript 如何隐式转换类型?
- python - 根据起始字母从字典中删除数据
- c# - 如何重新登录我在再次运行应用程序时创建的匿名帐户?
- ios - 如何在 iPhone X 中启用状态栏的智能反转?
- reactjs - .net core 2.1 与反应测试
- ios - UIView 默认属性和自定义属性