Вибір рядів серій / фреймів панд за цілим індексом


395

Мені цікаво, чому df[2]його не підтримують, df.ix[2]і тоді і те і df[2:3]інше працює.

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

Я би розраховував df[2]працювати так само, як df[2:3]і відповідати конвенції про індексацію Python. Чи є причина дизайну для того, щоб не підтримувати індексацію рядків одним цілим числом?


4
df.ix[2]не працює - принаймні не вpandas version '0.19.2'
Захра

9
Щоб побачити різницю між вибором рядків та стовпців через оператор індексації [], див. Цю відповідь нижче . Також НІКОЛИ ВИКОРИСТАННЯ .ix, це застаріло
Тед Петру

Відповіді:


551

відлуння @HYRY, дивіться нові документи в 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Тут у нас є нові оператори, .ilocщо підтримують explicity лише цілочисельну індексацію, а .locexplicity підтримують лише індексацію міток

наприклад, уявіть цей сценарій

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] розрізає лише рядки (за місцем розташування мітки)


7
Що робити, якщо ви хотіли 2-й І 3-й І 4-й ряд?
FaCoffee

1
ви можете просто передати список індексаторів; Документи вказані вище
Джефф

2
Хтось має виправдання для цих імен? Мені важко запам’ятати, тому що я не впевнений, чому ilocце рядки та locмітки.
kilojoules

3
@kilojoules .ilocшукає речі за порядком у індексі (наприклад .iloc[[2]]) - це другий "рядок" у df. Цей рядок, можливо, знаходиться в місці розташування індексу4 . .locшукає їх за своїм значенням індексу. То, може, "iloc" - це як "i", як у A[i]? :)
Джим К.

1
@Jeff - це чудово працює, але що відбувається, коли ви хочете скопіювати рядок із кадру даних, наприклад df.loc[-1] = df.iloc[[0]], та вставити це? Кадр має доданий стовпчик індексу, що дає помилку ValueError: cannot set a row with mismatched columns (див. Stackoverflow.com/questions/47340571/… )
Growler

63

Основною метою оператора індексації DataFrame []є вибір стовпців.

Коли оператору індексації передано рядок або ціле число, він намагається знайти стовпець з цим конкретним іменем і повернути його у вигляді Series.

Отже, у питанні вище: df[2]шукає ім’я стовпця, що відповідає цілому значенню 2. Цього стовпця не існує і KeyErrorпіднімається a .


Оператор індексації DataFrame повністю змінює поведінку для вибору рядків, коли використовується позначення зрізів

Як не дивно, коли дається фрагмент, оператор індексації DataFrame вибирає рядки і може робити це за допомогою цілого розташування або мітки індексу.

df[2:3]

Це буде фрагмент, починаючи з рядка з цілим розташуванням від 2 до 3, за винятком останнього елемента. Отже, лише один ряд. Далі вибираються рядки, що починаються з цілого розташування 6, але не включають 20 у кожному третьому ряду.

df[6:20:3]

Ви також можете використовувати фрагменти, що складаються з міток рядків, якщо ваш індекс DataFrame містить рядки в ньому. Детальніше дивіться це рішення на .iloc vs .loc .

Я майже ніколи не використовую це позначення фрагмента разом з оператором індексування, оскільки його явне і майже ніколи не використовується. При нарізанні рядами дотримуйтесь .loc/.iloc.


Спроба додати рядки до іншого фрейму даних за допомогою оператора indxeing, але інший кадр даних залишається порожнім. Чому?
FindOutIslamNow

23

Ви можете вважати DataFrame як диктант серії. df[key]спробуйте вибрати індекс стовпця за keyі повернути об’єкт Series.

Однак нарізання всередині [] зрізує рядки, оскільки це дуже поширена операція.

Ви можете прочитати документ докладно:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


Дякую за підказку Смішно, що така річ - це те, що все ще часом викликає панди з питаннями. Додаючи винятки з поведінки в певних ситуаціях, .. мені здається, що жертвуючи послідовністю заради трохи зручності.
Карл Бергер

15

Для індексованого доступу до таблиці панд можна також розглянути варіант numpy.as_array для перетворення таблиці в масив Numpy як

np_df = df.as_matrix()

і потім

np_df[i] 

працювали б.


11
що перемагає цілі індексів фреймворків даних і всього іншого, що пропонує панди
Fábio Dias

6

Ви можете подивитися вихідний код .

DataFrameмає приватну функцію _slice()для розрізання DataFrame, і вона дозволяє параметру axisвизначати, яку вісь нарізати. __getitem__()Для DataFrameне встановлює вісь при виклику _slice(). Тож _slice()виріжте його за замовчуванням осі 0.

Ви можете зробити простий експеримент, який може допомогти вам:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

5

ви можете провести цикл через такий кадр даних.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.