Pandas — Создать новый столбец и присвоить значения на основе фильтра

#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')