В чем разница между x.iloc [1] ['x'] и x ['x']. Iloc [1] - PullRequest
0 голосов
/ 16 января 2019

Я не могу изменить значение np.nan на 16 с x.iloc [1] ['x'] = 16, но я могу изменить его с помощью x ['x']. Iloc [1] = 16. Зачем? и в чем разница между этими двумя выражениями?

x = pd.DataFrame({'x': [1, np.nan, 3], 'y': [3, 4, 5]})

x.iloc[1]['x']=16

print(x.iloc[1]['x'])

nan

x['x'].iloc[1]=16

print(x.iloc[1]['x'])

16.0

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Избегать цепной индексации

Как отмечается в комментариях, ни один из ваших вариантов не гарантированно сработает. Документация объясняет обоснование и обоснование.

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

Для скаляров вы должны использовать iat для установки значений по целочисленной позиции или at по метке .

iat для скалярной установки по целочисленной позиции

x.iat[1, x.columns.get_loc('x')] = 16

at для скалярной настройки по метке

x.at[x.index[1], 'x'] = 16

Если ваш индекс данных представляет собой обычный pd.RangeIndex, последнее назначение может быть упрощено:

x.at[1, 'x'] = 16
0 голосов
/ 16 января 2019

Добро пожаловать в Stackoverflow ответ в комментарии ясен и достаточен.

iloc - отличный инструмент, я хотел бы добавить, что если вы хотите использовать его так, как вам нужно, вы должны сначала передать столбец, в котором вы хотите выбрать строку. Пример с циклом над фреймом данных для изменения значения:

import pandas as pd 

d = {'col1': [1, 2,'np.nan',4,5], 'col2': ['A','B','C','D','E']}
df = pd.DataFrame(data=d)

     col1 col2
0       1    A
1       2    B
2  np.nan    C
3       4    D
4       5    E


for i in range(len(df)):
    if df['col1'].iloc[i] == "np.nan":
            df['col1'].iloc[i] = 16 

print(df)
   col1 col2
0     1    A
1     2    B
2    16    C
3     4    D
4     5    E
...