python - pandas 系列中的矢量化索引 numpy 数组与 pandas 系列中的 bool numpy 数组

标签 python pandas numpy

以下可重现的代码生成了一个示例数据集,它在更小的范围内模仿我的数据。

import numpy as np 
import pandas as pd

np.random.seed(142536)

df = pd.DataFrame({
        "vals": list(np.arange(12).reshape(3,4)),
        "idx" : list(np.random.choice([True, False], 12).reshape(3,4))})
df

                           idx            vals
0   [False, True, True, False]    [0, 1, 2, 3]
1    [True, True, False, True]    [4, 5, 6, 7] 
2  [False, True, False, False]  [8, 9, 10, 11] 

以下可重现的代码返回了我想要的结果,但对于大型数据集来说效率很低。
我怎样才能更有效地做到这一点?

sel = []
for i in range(len(df.vals)):
    sel.append(df.vals[i][df.idx[i]])

df['sel'] = sel
df

                           idx            vals        sel
0   [False, True, True, False]    [0, 1, 2, 3]     [1, 2]
1    [True, True, False, True]    [4, 5, 6, 7]  [4, 5, 7]
2  [False, True, False, False]  [8, 9, 10, 11]        [9]

我已经尝试过 np.apply_along_axis()np.where()df.apply()df .transform(),但无法让它们中的任何一个在这种情况下正常工作。

最佳答案

前提是不好的,因为你不应该像这样存储数据。您至少可以通过使用 itertools.chain 连接数据、建立索引然后使用 np.array_split 拆分结果来加快速度。

from itertools import chain

fn = lambda x: np.array(list(chain.from_iterable(x)))
df['sel'] = np.array_split(
    fn(df.vals)[fn(df.idx)], np.cumsum([sum(x) for x in df.idx][:-1]))

                           idx            vals      sel
0   [True, False, True, False]    [0, 1, 2, 3]   [0, 2]
1  [False, False, False, True]    [4, 5, 6, 7]      [7]
2   [False, True, True, False]  [8, 9, 10, 11]  [9, 10]

关于python - pandas 系列中的矢量化索引 numpy 数组与 pandas 系列中的 bool numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51813335/

相关文章:

Python UnicodeEncodeError,但我已将参数编码为 UTF-8

python - 绘制条形图和 Groupby 关键字

python - 数组按括号中的条件索引

python - Pandas dataframe 按一些值填充

Python 使用 mechanize 提交 post 数据

python - 如何使用 pylab.imshow() 显示 np.array

python - Pandas 奇怪的 SettingWithCopyWarning 警告

python - 无法根据 pandas 列中的非条件替换字符串

python - 用python拟合曲线

python - 使用正则表达式从另一个列表中选择列表