【问题标题】:Slice a Pandas dataframe by an array of indices and column names通过索引和列名数组对 Pandas 数据帧进行切片
【发布时间】:2014-07-04 09:24:29
【问题描述】:

我希望使用 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]

在熊猫中:

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 相同的值?

【问题讨论】:

  • 严格来说,这不是一个 (row,col) 索引数组,而是一个多维索引数组。如果我的理解是正确的,请相应地编辑标题。

标签: python numpy pandas dataframe slice


【解决方案1】:

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])

或者这个;因为 Period 索引将从字符串中正确切片(此处不要使用整数)

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

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

【讨论】:

  • 我的问题实际上措辞不佳。我正在寻找使用索引和列名来切片,我编辑了我的问题以反映这一点。抱歉不清楚。
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2018-12-25
  • 2019-07-22
  • 2015-05-21
  • 2021-11-08
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多