Срез фрейма данных Pandas по массиву индексов и имен столбцов
Я ищу, чтобы воспроизвести поведение массива numpy с фреймом данных pandas. Я хочу передать массив индексов и имен столбцов и получить список объектов, которые находятся в соответствующем имени индекса и столбца.
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?
1 ответов
панды не поддерживают это напрямую; это может быть, но проблема в том, как указать, что вы хотите координаты, а не разные оси, например 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