Pandas применить, объект 'float' не является подписным - PullRequest
1 голос
/ 31 января 2020

У меня есть следующий фрейм данных:

Y = list(range(5))
Z = np.full(5, np.nan)
df = pd.DataFrame(dict(ColY = Y, ColZ = Z))
print(df)
   ColY  ColZ
0     0   NaN
1     1   NaN
2     2   NaN
3     3   NaN
4     4   NaN

И этот словарь:

Dict = {
    0 : 1,
    1 : 2,
    2 : 3,
    3 : 2,
    4 : 1
}

Я хотел бы заполнить ColZ "ok", если соответствующее значение ColY через Dict равно 2 Следовательно, я хотел бы следующий кадр данных:

   ColY ColZ
0     0  NaN
1     1   ok
2     2  NaN
3     3   ok
4     4  NaN

Я пробовал этот сценарий:

df['ColZ'] = df['ColZ'].apply(lambda x : "ok" if Dict[x['ColY']] == 2 else Dict[x['ColY']])

У меня есть эта ошибка:

TypeError: 'float' object is not subscriptable

Знаете ли вы почему?

1 Ответ

2 голосов
/ 31 января 2020

Используйте numpy.where с Series.map для новой серии для сравнения по Series.eq (==):

df['ColZ'] = np.where(df['ColY'].map(Dict).eq(2), 'ok', np.nan)
print(df)
   ColY ColZ
0     0  nan
1     1   ok
2     2  nan
3     3   ok
4     4  nan

Сведения :

print(df['ColY'].map(Dict))
0    1
1    2
2    3
3    2
4    1
Name: ColY, dtype: int64

Ваше решение следует изменить с помощью .get для возврата некоторого значения по умолчанию, здесь np.nan, если нет совпадений:

df['ColZ'] = df['ColY'].apply(lambda x : "ok" if Dict.get(x, np.nan) == 2 else np.nan)

РЕДАКТИРОВАТЬ: для работы с значениями df['ColZ'] используйте:

Y = list(range(5))
Z = list('abcde')
df = pd.DataFrame(dict(ColY = Y, ColZ = Z))
print(df)
Dict = {
    0 : 1,
    1 : 2,
    2 : 3,
    3 : 2,
    4 : 1
}

df['ColZ1'] = np.where(df['ColY'].map(Dict).eq(2), 'ok', df['ColZ'])
df['ColZ2'] = df.apply(lambda x : "ok" if Dict.get(x['ColY'], np.nan) == 2 
                                       else x['ColZ'], axis=1)
print (df)
   ColY ColZ ColZ1 ColZ2
0     0    a     a     a
1     1    b    ok    ok
2     2    c     c     c
3     3    d    ok    ok
4     4    e     e     e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...