Я пытаюсь узнать, как подмножество работает в pandas DataFrame. Я сделал случайный фрейм данных, как показано ниже.Подмножество DataFrame с использованием ix в Python
import pandas as pd
import numpy as np
np.random.seed(1234)
X = pd.DataFrame({'var1' : np.random.randint(1,6,5), 'var2' : np.random.randint(6,11,5),
'var3': np.random.randint(11,16,5)})
X = X.reindex(np.random.permutation(X.index))
X.iloc[[0,2], 1] = None
X возвращается,
var1 var2 var3
0 3 NaN 11
4 3 9 13
3 2 NaN 14
2 5 9 12
1 2 7 13
панды метод .loc
строго этикеток на основе и .iloc
для целочисленных позиций. .ix
можно использовать для комбинирования позиционных индексов и меток.
Однако в приведенном выше примере индексы строк являются целыми числами, а .ix
понимает их как индексы строк, а не позиции. Предположим, что я хочу получить первые две строки «var2». В R, X[1:2, 'var2']
даст ответ. В Python X.ix[[0,1], 'var2']
возвращает NaN 7
, а не NaN 9
.
Вопрос: «Есть ли простой способ дать .ix
знать, что индексы основаны на позиции?»
Я нашел некоторые решения для этого, но в некоторых случаях они не простые и интуитивные.
Например, используя _slice()
, как показано ниже, я мог бы получить результат, который хотел.
>>> X._slice(slice(0, 2), 0)._slice(slice(1,2),1)
var2
0 NaN
4 9
Когда индексы строк не являются целыми числами, проблем нет.
>>> X.index = list('ABCED')
>>> X.ix[[0,1], 'var2']
A NaN
B 9
Name: var2, dtype: float64
Но у вас есть метод индексирования с использованием целочисленного местоположения, поэтому почему бы просто не использовать 'iloc', чтобы избежать неоднозначной индексации? – EdChum
@EdChum Да, 'X.iloc [[0,1], 1]' возвращает подмножество, но есть случай, когда вы знаете только имя атрибута 'var2'. – NeoJi
@EdChum Возможно, вы правы. Я не мог придумать ни одного случая, что я знаю только имена атрибутов. Думаю, я зашел слишком далеко. – NeoJi