在python中只循环一定范围的对象索引

时间:2017-09-20 16:38:42

标签: pandas loops object indexing append

我正在尝试根据该数据帧中的两个预先存在的列附加一个pandas数据帧。我遇到的问题是pandas数据帧的索引是对象格式,而不是整数格式。为了使事情变得更复杂,我只想附加一定范围的数据帧,将新列中的剩余单元格保留为“NaN'”。为了只附加一定范围的数据帧,我将不得不使用" for"环。

这是我的问题:当我有对象索引时,如何在数据帧的某个范围内循环?

我的初始pandas数据帧只是......

import pandas as pd

dates = ['2005Q4','2006Q1','2006Q2','2006Q3','2006Q4','2007Q1','2007Q2']
col1 = [ 5.9805, 6.2181, 6.3508, 6.7878, 6.6212, 6.4583, 6.4068 ]
col2 = [ 'NaN', -0.001054985938, -0.121731711952, 0.046275331889, 
         -0.017517211963, -0.023422842422, 0.009072170884 ]

data = pd.DataFrame(
                    {
                     'col1':   col1,
                     'col2':   col2
                     },
                     columns = [
                                'col1',
                                'col2'
                                ],
                     index = dates
                    )

我试图做的就是这样......

data['col3'] = 'NaN'

for i in range('2006Q1','2006Q4',1):
    data['col3'][i]  =  data['col1'][i-1] +\
                        data['col2'][i]

天真地,我曾希望python能够将索引中的对象名称与与该特定indice关联的实际索引号相关联。例如,如果我将索引定义为给定,python将能够知道' 2005Q4'是index = 0,' 2006Q1'是index = 1等。通过这种方式,我可以在range()函数中使用对象字符串,它仍然可以知道我所指的整数。但是,情况似乎并非如此。

我还需要避免将对象转换为日期格式。重要的是我将索引保持为#Year; YearQuarter'格式,我还没有找到一种使用能够执行此操作的pd.to_datetime的简单方法。

有没有人对如何在python中仅循环某些范围的基于对象的索引有任何建议?

1 个答案:

答案 0 :(得分:0)

.index()与列表一起使用会返回您要查找的项目的索引。尝试将此调整发送到for循环。

for i in range(dates.index('2006Q1'),dates.index('2006Q4'),1):

显然,更有效的方法可以做到这一点。 .shift()会根据您的需要向上或向下移动整个列:

data['col3'] = data.col1 - data.col2.shift(-1)