2016-07-08 3 views
1

Есть ли способ в Pandas получить значение по умолчанию при доступе к строке по позиции? Я знаю функцию .get(), но это работает при поиске по индексу.get() для значений по умолчанию в серии Pandas, используя позицию

Ниже приводится описание того, что я хочу. DataFrame:

In [24]: df 
Out[24]: 
    col1 
idx 
20  A 
21  B 
22  C 
23  D 
24  E 

Поиск по индексу и получить значение по умолчанию работает отлично:

In [25]: df['col1'].get(23, 'the_default_value') 
Out[25]: 'D' 

In [26]: df['col1'].get(28, 'the_default_value') 
Out[26]: 'the_default_value' 

Но не кажется, эквивалентный способ поиска по позиции. Я могу использовать .iloc(), но это не помогает получить значение по умолчанию, если эта строка отсутствует. Например.

In [57]: df['col1'].iloc[2] 
Out[57]: 'C' 

In [58]: df['col1'].iloc[6] 
... 
IndexError: single positional indexer is out-of-bounds 

Я могу установить его с помощью try...except или заранее проверить, существует ли значение или нет, но есть более чистый способ сделать это, как .iget() (как .loc против .iloc)?

+0

Вы можете просто сбросить индекс, чтобы он начинался с '0' – EdChum

+0

Да, это возможно. Но если мне нужен фактический индекс, это будет означать возврат туда и обратно сброса индекса (одно из применений находится внутри цикла). – vk1011

ответ

0
считать

Would что-то вроде этого уборщик:

df['new_index'] = np.arange(df.shape[0]) 
df = df.set_index('new_index') 

df['col1'].get(2, 'the_default_value') 

Если требуется первоначальный индекс, то это может быть полезно использовать многоиндексной

df['new_index'] = np.arange(df.shape[0]) 
df = df.set_index('new_index', append=True) 

df['col1'].get((pd.IndexSlice[:], 2), 'the_default_value') 
+1

Спасибо, но похоже, что он становится более сложным в удобочитаемости. Я думаю, что в вашем первом решении вам также нужно избавиться от исходного индекса, чтобы он работал - в этом случае проще просто выполнить 'df.reset_index()'. Но я стараюсь не менять индекс. – vk1011

0

Хорошо, я получил еще один ответ :

n = 2 
df['col1'].get(df.index[n] if n < df.shape[0] else None, 'hi') 

Таким образом, использование получить с позиционными значениями в индекс ...