【问题标题】:indexing to fill a preallocated pandas dataframe索引以填充预先分配的熊猫数据框
【发布时间】:2018-07-17 11:29:10
【问题描述】:

我有一个(简单的)索引问题:我有一个预先分配的数组,并希望用计算值填充它以进行进一步处理。这是一个例子:

import pandas as pd
import numpy as np

meanMov = pd.DataFrame(columns=range(3),index=range(20))

value1 = np.array([23.5,-42.34,322.4])
value2 = np.array([43,-764.56,6.4556])
value3 = np.array([98.54,-26.64,86.45])

meanMov.iloc[0:5] = value1
meanMov.iloc[5:15] = value2
meanMov.iloc[15:20] = value3

这会导致以下错误:

ValueError: cannot set using a slice indexer with a different length than the value

我该如何解决这个问题?非常感谢!!

【问题讨论】:

  • 您似乎知道每个数组要重复多少次。真的是这样吗?这似乎是一种乏味的插入方式。

标签: python pandas numpy dataframe indexing


【解决方案1】:

您需要: 来选择所有列:

meanMov.iloc[0:5,:] = value1
meanMov.iloc[5:15,:] = value2
meanMov.iloc[15:20,:] = value3
print (meanMov)
        0       1       2
0    23.5  -42.34   322.4
1    23.5  -42.34   322.4
2    23.5  -42.34   322.4
3    23.5  -42.34   322.4
4    23.5  -42.34   322.4
5      43 -764.56  6.4556
6      43 -764.56  6.4556
7      43 -764.56  6.4556
8      43 -764.56  6.4556
9      43 -764.56  6.4556
10     43 -764.56  6.4556
11     43 -764.56  6.4556
12     43 -764.56  6.4556
13     43 -764.56  6.4556
14     43 -764.56  6.4556
15  98.54  -26.64   86.45
16  98.54  -26.64   86.45
17  98.54  -26.64   86.45
18  98.54  -26.64   86.45
19  98.54  -26.64   86.45

【讨论】:

    【解决方案2】:

    您不需要预先初始化。您可以使用重复值列表调用repeat,然后创建最终的DataFrame。

    r = [5, 10, 5]
    v = [value1, value2, value3]
    

    pd.DataFrame(np.repeat(v, r, axis=0))
    
            0       1         2
    0   23.50  -42.34  322.4000
    1   23.50  -42.34  322.4000
    2   23.50  -42.34  322.4000
    3   23.50  -42.34  322.4000
    4   23.50  -42.34  322.4000
    5   43.00 -764.56    6.4556
    6   43.00 -764.56    6.4556
    7   43.00 -764.56    6.4556
    8   43.00 -764.56    6.4556
    9   43.00 -764.56    6.4556
    10  43.00 -764.56    6.4556
    11  43.00 -764.56    6.4556
    12  43.00 -764.56    6.4556
    13  43.00 -764.56    6.4556
    14  43.00 -764.56    6.4556
    15  98.54  -26.64   86.4500
    16  98.54  -26.64   86.4500
    17  98.54  -26.64   86.4500
    18  98.54  -26.64   86.4500
    19  98.54  -26.64   86.4500
    

    【讨论】:

    • 非常感谢这种优雅的方式,它确实更快!但是现在我发现了动态值的另一个问题,这里有一个例子:data = np.random.rand(50,3)r = [15, 20, 15]v = [value1, value2, value3]value1 = (data[0:15]).mean(axis=0)value3 = (data[35:50]).mean(axis=0)value2 = []for j in range(15,35): value2.append((data[(j-eps):(j+eps+1)]).mean(axis=0))pd.DataFrame(np.repeat(v, r, axis=0))有没有办法使用 np 放置 value2 .repeat 到 pd.DataFrame?
    • @osteocyt 我不确定我是否遵循...到底是什么让你绊倒了?您已经定义了 v,现在您正在尝试覆盖数组?
    • 问题在于 value2 现在是“动态的”,这意味着它由 for 循环产生的 20 个三元组数字组成,而不仅仅是 value1 和 value3 中的一个三元组。因此,value2 的范围应该在我的最终数据框中包含不同的数字
    • @osteocyt 嗨,如果这有帮助,请考虑为答案投票(单击左侧 0 上方的三角形)。如果您还有其他问题,可以开新帖。
    猜你喜欢
    • 2020-11-08
    • 2017-11-03
    • 2021-12-30
    • 1970-01-01
    • 2016-12-11
    • 2018-03-25
    • 2022-07-10
    • 2021-07-24
    • 2020-03-30
    相关资源
    最近更新 更多