【问题标题】:Pandas: Apply indexed list of values to dataframePandas:将索引值列表应用于数据框
【发布时间】:2017-04-04 02:52:39
【问题描述】:
import pandas as pd
import numpy as np

我有一个数据框:

my_df = pd.DataFrame({'target': [0   ,0   ,0   ,0   , 300, 400, 500, 600, 0],
                   'class' : [0  ,0   ,0   ,0   ,   1,   1,   1,   1,   0],
                   'feature':[12 ,13  ,13  ,200 , 900, 800, 600, 600,  12]})

我有一个生成索引更新集的过程,表示为一对列表:

update_index  = [0 ,  1,  2,   3,   8]
update_values = [20, 25, 25, 150,  25]

或者,我可以将这些表示为元组列表:

update_tuples = [(0,20), (1,25), (2,25), (3,150), (8,25)]

或者,理想情况下,我希望能够将它们表示为一对 numpy 数组 - 因为这更有可能是我生成它们的形式。

update_index_array  = np.array([0 ,  1,  2,   3,   8])
update_values_array = np.array([20, 25, 25, 150,  25])

除了表达式选项之外,我找到了一种方法,可以在我的索引集中指定的位置使用我的值集中的值更新我的数据框,这很有效,但它有点慢(而且丑陋!)。

[my_df.set_value(i,'target',v) for i,v in update_tuples]

这是一个问题,因为在我的真实示例中,我有成千上万(数百万?)的更新要执行。

我想找到的是某种 numpy 加速的单次更新(即没有列表理解),它将更新放到适当的目标位置,而不会覆盖非索引位置中的现有值.

有什么想法吗?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    是的,这肯定不是在pandas 中你会这样做。相反,使用索引分配:

    >>> my_df.loc[update_index_array, 'target'] = update_values_array
    >>> my_df
       class  feature  target
    0      0       12      20
    1      0       13      25
    2      0       13      25
    3      0      200     150
    4      1      900     300
    5      1      800     400
    6      1      600     500
    7      1      600     600
    8      0       12      25
    >>>
    

    顺便说一句,你应该永远使用这样的推导:

    [my_df.set_value(i,'target',v) for i,v in update_tuples]
    

    列表推导式不仅仅是编写 for 循环的奇特方式,它们还用于创建新列表。这是将函数式编程构造、列表理解与状态更改(即my_df.set_value)混合在一起。这简直就是不连贯的风格。但更糟糕的是,这也很浪费,因为您正在创建对同一数据框的无用引用列表。相反,只需使用 for 循环。类似的情况是这样的:

    >>> my_list = []
    >>> [my_list.append(i) for i in range(5)]
    [None, None, None, None, None]
    >>> my_list
    [0, 1, 2, 3, 4]
    

    不要那样做。如果要使用副作用,只需使用 for 循环即可。

    【讨论】:

    • 只是票,谢谢 - 是的,我本能地觉得列表理解不是正确的方法。你的解释有助于为这种直觉提供一些背景,所以也谢谢你。
    猜你喜欢
    • 2016-12-10
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2016-12-22
    • 2018-11-21
    相关资源
    最近更新 更多