gpt4 book ai didi

python - Pandas:将索引值列表应用于数据框

转载 作者:行者123 更新时间:2023-11-30 22:39:20 24 4
gpt4 key购买 nike

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 加速的单次更新(即无列表理解),它将更新更新到适当的目标位置,而不覆盖非索引位置中的现有值。

请问有什么想法吗?

最佳答案

是的,这肯定不是您在 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 循环即可。

关于python - Pandas:将索引值列表应用于数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43191875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com