#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Допустим, у меня есть фрейм данных
id category
1 A
2 A
3 B
4 C
5 A
И я хочу создать новый столбец с инкрементными значениями, где category == 'A'
. Итак, это должно быть что-то вроде.
id category value
1 A 1
2 A 2
3 B NaN
4 C NaN
5 A 3
В настоящее время я могу сделать это с
df['value'] = pd.nan
df.loc[df.category == "A", ['value']] = range(1, len(df[df.category == "A"]) 1)
Есть ли лучший / pythonic способ сделать это (т. Е. Мне не нужно инициализировать столбец значений с помощью nan? И в настоящее время этот метод присваивает мне тип float вместо integer, чего я и хочу.
Ответ №1:
Другим способом может быть
df['value'] = df['category'].eq('A').cumsum()
df['value'][df['category']!='A'] = pd.NA
Ответ №2:
Столбец value
не обязательно инициализировать, если значения по умолчанию NaN
, если создать без []
, также для подсчета значений маски используется sum
:
m = df.category == "A"
df.loc[m, 'value'] = range(1, m.sum() 1)
df['value'] = df['value'].astype('Int64')
print (df)
0 1 A 1
1 2 A 2
2 3 B <NA>
3 4 C <NA>
4 5 A 3
При необходимости также установите целые числа с нулевым значением:
m = df.category == "A"
df['value'] = m.cumsum().where(m).astype('Int64')
print (df)
id category value
0 1 A 1
1 2 A 2
2 3 B <NA>
3 4 C <NA>
4 5 A 3
Комментарии:
1. Есть ли способ присвоить ему тип данных integer вместо float? или это как дополнительная строка для преобразования столбца значений в целое число?
2. @skinnyas123 — Я думаю, что проще всего преобразовать в целое число с нулевым значением после моего решения, проверьте это следующим образом
df['value'] = df['value'].astype('Int64')