Вот пример кода.
import pandas as pd, numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10, 1)), columns=list('A'))
У меня есть список dl=[0,2,3,4,7]
В позициях индекса, указанных в списке, я хотел бы иметь столбец A как «Да».
Следующий код работает
df.loc[dl,'A']='Yes'
Как заполнить столбец «А» значением «Нет» для значений столбца, не входящих в индекс. Пожалуйста, простите меня, если это дубликат сообщения.
Один из способов — использовать функцию isin. '~' изменит его так, что на выходе будут элементы, которых нет в dl.
df.loc[~df.index.isin(dl),'A']='No'
Сначала заполните все строки «А» «Нет». Затем обновите/перезапишите определенные строки с помощью «Да».
df.loc[:,'A']='No'
df.loc[dl,'A']='Yes'
np.where
Я предполагаю, что есть лучший способ сделать и 'Yes'
, и 'No'
одновременно. Если вы действительно просто хотите заполнить 'No'
после того, как уже получили 'Yes'
, обратитесь к ответу Судьба.
df.loc[:, 'A'] = np.where(df.index.isin(dl), 'Yes', 'No')
Не предназначен для реальных предложений
f = dl.__contains__
g = ['No', 'Yes'].__getitem__
df.loc[:, 'A'] = [*map(g, map(f, df.index))]
df
A
0 Yes
1 No
2 Yes
3 Yes
4 Yes
5 No
6 No
7 Yes
8 No
9 No
используя разницу между списком dl и самим списком df:
df.iloc[list( set(df.index) - set(dl))] = 'No'
или
df.iloc[[x for x in range(len(df)) if x not in dl]] = 'No'
Что интересно, loc
прекрасно справляется с set
. Сократить синтаксис с помощью небольшой распаковки литералов (даже не знаю, как это назвать) df.loc[{*df.index} - {*dl}, 'A'] = 'No'
Кроме того, для протокола, я думаю, что это самый красноречивый способ ответить на фактический вопрос ОП.
pandas.Index
объекты уже имеютdifference
метод. Так что это должно работать:df.loc[df.index.difference(dl), 'A'] = 'No'