KeyError: в пандах при попытке изменить значения логического столбца в строку при использовании метода .loc - PullRequest
0 голосов
/ 06 сентября 2018

Я выполняю условный цикл для создания нового столбца в моем DataFrame (TDF) на основе значения столбца "only". Если значение равно 0, добавьте строку «один», иначе добавьте «с семейством» в столбец «только». Я использую код: Я получаю сообщение об ошибке:

tdf['alone'].loc[['alone'] >0]= 'with family'
tdf['alone'].loc[['alone'] ==0] = 'alone'

После запуска вышеуказанной строки я получаю следующую ошибку:

KeyError: 'cannot use a single bool to index into setitem'

Я задавал этот тот же вопрос , и я понял, что мне нужно иметь row_indexer в tdf['alone'].loc[[row_indexer,['alone']] = 'alone', но я не уверен, как получить значения в row_indexer

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Нужно boolean indexing с loc и логическими масками - сравните столбец DataFrame со значением 0, а не с одним списком элементов [alone]:

tdf.loc[tdf['alone'] > 0, 'alone'] = 'with family'
tdf.loc[tdf['alone'] ==0, 'alone'] = 'alone'

Если возможны не отрицательные числа, используйте numpy.where:

tdf['alone'] = np.where(tdf['alone'] == 0,  'alone', 'with family')

Sample

tdf = pd.DataFrame({'alone':[4,4,5,0,5,0],
                   'col':[1,1,9,4,2,3]})

print (tdf)
   alone  col
0      4    1
1      4    1
2      5    9
3      0    4
4      5    2
5      0    3

tdf['alone'] = np.where(tdf['alone'] == 0,  'alone', 'with family')
print (tdf)

         alone  col
0  with family    1
1  with family    1
2  with family    9
3        alone    4
4  with family    2
5        alone    3

Также решение является неправильным, потому что цепочечные назначения - это может создать копию, которая обновляет копию tdf['alone'], которую вы не увидите:

#added boolean mask tdf['alone'] > 0
tdf['alone'].loc[tdf['alone'] > 0 ]= 'with family'
0 голосов
/ 06 сентября 2018

pandas.Series.clip

обрезать значения будут только 0 и 1 и использовать его для нарезки массива

tdf.assign(alone=np.array(['alone', 'with family'])[tdf.alone.clip(0, 1)])

         alone  col
0  with family    1
1  with family    1
2  with family    9
3        alone    4
4  with family    2
5        alone    3

pandas.Series.map

tdf.assign(alone=tdf.alone.map(lambda x: 'with family' if x else 'alone'))

         alone  col
0  with family    1
1  with family    1
2  with family    9
3        alone    4
4  with family    2
5        alone    3

map

Версия 2

tdf.assign(alone=tdf.alone.map(lambda x: {0: 'alone'}.get(x, 'with family')))

         alone  col
0  with family    1
1  with family    1
2  with family    9
3        alone    4
4  with family    2
5        alone    3

Настройка

Заимствовано у @ jezrael

tdf = pd.DataFrame({'alone':[4,4,5,0,5,0],
                   'col':[1,1,9,4,2,3]})
0 голосов
/ 06 сентября 2018

[['alone'] > 0] сравнивает список Python ['alone'] с целым числом 0.Вместо этого используйте следующее:

tdf.loc[tdf['alone'] > 0, 'alone'] = 'with family'
tdf.loc[tdf['alone'] == 0, 'alone'] = 'alone'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...