通过索引数组和列名切片Pandas数据框

6 投票
1 回答
8364 浏览
提问于 2025-04-18 06:42

我想要让一个pandas数据框的行为和numpy数组一样。我想传入一些索引和列名,然后得到一个在对应的索引和列名下找到的对象列表。

import pandas as pd
import numpy as np

在numpy中:

array=np.array(range(9)).reshape([3,3])
print array
print array[[0,1],[0,1]]

[[0 1 2]
 [3 4 5]
 [6 7 8]]

[0 4]

在pandas中:

prng = pd.period_range('1/1/2011', '1/1/2013', freq='A')
df=pd.DataFrame(array,index=prng)
print df

      0  1  2
2011  0  1  2
2012  3  4  5
2013  6  7  8

df[[2011,2012],[0,1]]

期望的输出:

[0 4]

我该如何切片这个数据框,以便它返回和numpy一样的结果呢?

1 个回答

8

Pandas这个库并不直接支持这个功能;其实它可以做到,但问题在于怎么告诉它你想要的是坐标,而不是不同的轴。比如说,df.iloc[[0,1],[0,1]]的意思是让我取第0行和第1行,以及第0列和第1列。

不过,你可以这样做:

你更新了问题,说明你想从索引值开始

In [19]: row_indexer = df.index.get_indexer([Period('2011'),Period('2012')])

In [20]: col_indexer = df.columns.get_indexer([0,1])

In [21]: z = np.zeros(df.shape,dtype=bool)

In [22]: z[row_indexer,col_indexer] = True

In [23]: df.where(z)
Out[23]: 
       0   1   2
2011   0 NaN NaN
2012 NaN   4 NaN
2013 NaN NaN NaN

不过这样似乎更简单(这些是位置)

In [63]: df.values[[0,1],[0,1]]
Out[63]: array([0, 4])

或者这样;因为周期索引会从字符串中正确切片(这里不要用整数)

In [26]: df.loc['2011',0]
Out[26]: 0

In [27]: df.loc['2012',1]
Out[27]: 4

撰写回答