使用包含数组的句点索引切片Pandas数据帧

时间:2015-12-01 12:45:10

标签: python pandas slice

我试图将一个由句点索引编制索引的pandas数据帧与一个包含意外结果的字符串列表进行切片。

import pandas as pd
import numpy as np
idx = pd.period_range(1991,1993,freq='A')    
df = pd.DataFrame(np.arange(9).reshape(3,3),index=idx)
print df.loc[['1991','1993'],:]

结果:

KeyError: "None of [['1991', '1993']] are in the [index]"

如果最后一行切换为:

print df.ix[['1991','1993'],:]

输出

Out[128]:
        0   1   2
1991    NaN NaN NaN
1993    NaN NaN NaN

如果不是句号索引,我有

idx = [str(year) for year in range(1991,1994)]
print df.loc[['1991','1993'],:]

然后输出符合预期:

Out[127]:
        0   1   2
1991    0   1   2
1993    6   7   8

所以我的问题是:如何用句点索引切片pandas数据帧?

1 个答案:

答案 0 :(得分:3)

Pandas不会为您将字符串转换为句点,因此您必须更加明确。你可以使用:

In [38]: df.loc[[pd.Period('1991'), pd.Period('1993')], :]
Out[38]: 
      0  1  2
1991  0  1  2
1993  6  7  8

In [39]: df.loc[map(pd.Period, ['1991', '1993']), :]
Out[39]: 
      0  1  2
1991  0  1  2
1993  6  7  8

In [40]: df.loc[[idx[0],idx[-1]], :]
Out[40]: 
      0  1  2
1991  0  1  2
1993  6  7  8

顺便说一下,当您将任意项目列表传递给df.loc时,Pandas会返回一个新的子数据框架,其中包含来自df的值的副本。这不是一个切片。要进行切片,您需要使用切片表示法:a:b。例如,

In [64]: df.loc[pd.Period('1991'): pd.Period('1993'): 2, :]
Out[64]: 
        0  1  2
1991    0  1  2
1993    6  7  8

区别很重要,因为在NumPy和Pandas slices return views while non-slice indexing return copies中。