单个位置索引器越界遍历熊猫数据框

Posted

技术标签:

【中文标题】单个位置索引器越界遍历熊猫数据框【英文标题】:Single Positional Indexer out of bounds Iterating through pandas dataframe 【发布时间】:2018-02-10 08:38:48 【问题描述】:

我有一个数据框 myDF,我希望使用来自其他列的条件组合并将其中的一列设置为零,并使用第二个数据框标准DF进行索引。

myDF.head():

       DateTime  GrossPowerMW USDateTime_string  DateTime_timestamp  \
0  01/01/1998 00:00        17.804  01/01/1998 00:00 1998-01-01 00:00:00   
1  01/01/1998 01:00        18.751  01/01/1998 01:00 1998-01-01 01:00:00   
2  01/01/1998 02:00        20.501  01/01/1998 02:00 1998-01-01 02:00:00   
3  01/01/1998 03:00        22.222  01/01/1998 03:00 1998-01-01 03:00:00   
4  01/01/1998 04:00        24.437  01/01/1998 04:00 1998-01-01 04:00:00   

   Month  Day  Hour  GrossPowerMW_Shutdown  
0      1    3     0                 17.804  
1      1    3     1                 18.751  
2      1    3     2                 20.501  
3      1    3     3                 22.222  
4      1    3     4                 24.437  

标准DF:

       STARTTIME  ENDTIME
Month                    
1            9.0     12.0
2            9.0     14.0
3            9.0     14.0
4            9.0     14.0
5            9.0     13.0
6            9.0     14.0
7            9.0     13.0
8            9.0     12.0
9            9.0     14.0
10           9.0     13.0
11           9.0     13.0
12           9.0     11.0

myDF 然后通过以下 for 循环运行:

month = 1
for month in range (1, 13):
    shutdown_hours = range(int(criteriaDF.iloc[month]['STARTTIME']), int(criteriaDF.iloc[month]['ENDTIME']))
    myDF.loc[(myDF["Month"].isin([month])) & (myDF["Hour"].isin(shutdown_hours)) & (myDF["Day"].isin(shutdown_days)), "GrossPowerMW_Shutdown"] *= 0
    month = month + 1

这给出了以下错误:

Traceback(最近一次调用最后一次):

文件“”,第 1 行,在 runfile('myscript.py', wdir='C:myscript')

文件 "C:\ProgramData\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", 第 880 行,在运行文件中 execfile(文件名,命名空间)

文件 "C:\ProgramData\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", 第 87 行,在 execfile 中 exec(compile(scripttext, filename, 'exec'), glob, loc)

文件“myscript.py”,第 111 行,在 Gross_yield,curtailed_yield,shutdown_loss,df_testing = calculate_loss(input_file,input_shutdownbymonth,shutdown_days) #返回df仅用于测试/询问。完成后删除。

文件“myscript.py”,第 79 行,在 calculate_loss 中 shutdown_hours = range(int(criteriaDF.iloc[month]['STARTTIME']), int(criteriaDF.iloc[month]['ENDTIME']))

文件 "C:\ProgramData\Anaconda2\lib\site-packages\pandas\core\indexing.py", 第 1328 行,在 __getitem__ return self._getitem_axis(key, axis=0)

文件 "C:\ProgramData\Anaconda2\lib\site-packages\pandas\core\indexing.py", 第 1749 行,在 _getitem_axis self._is_valid_integer(key, axis)

文件 "C:\ProgramData\Anaconda2\lib\site-packages\pandas\core\indexing.py", 第 1638 行,在 _is_valid_integer raise IndexError("单个位置索引器越界")

IndexError: 单个位置索引器超出范围

但是如果我设置了脚本可以工作

month = 0
for month in range (0, 12)

但是,这不符合我的数据框在列 ['Month'] 上的索引,该列运行 1 - 12 而不是 0 -> 11。

为了确认我的理解是这样的

range (1, 13)

返回

[1,2,3,4,5,6,7,8,9,10,11,12].

我还尝试使用月份 = 12 的 for 循环中的代码逐行手动运行代码。所以我不确定为什么在愤怒中使用月份 (1, 13) 不起作用,注意到 12 是最高的列表范围 (1,13) 中的整数。

我的代码或方法有什么错误?

【问题讨论】:

【参考方案1】:

您正在使用iloc,它是“用于按位置选择的纯整数位置索引”。所以它只计算你的行从 0 到 11 你应该使用 loc 来查看你的索引值(所以 1 到 12)

【讨论】:

以上是关于单个位置索引器越界遍历熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.x - iloc 抛出错误 - “单个位置索引器超出范围”

如何更改熊猫数据框中的单个索引值?

通过某些(索引)参数将值插入熊猫数据框中“适当”位置的最佳方法是啥?

访问熊猫数据框索引时出错

无法使用这些索引器对 DatetimeIndex 进行位置索引

如何在遍历熊猫数据框时创建新列并插入行值