присваивать значение фрейму данных в первой строке, удовлетворяющей условию

#python #pandas #dataframe #indexing #variable-assignment

#python #pandas #фрейм данных #индексирование #переменная-назначение

Вопрос:

У меня есть фрейм данных pandas, и я хотел бы добавить столбец и установить определенные значения на основе определенных условий.

Инициализация

Смотрите мой следующий пример:

 import numpy as np
import pandas as pd

df=pd.DataFrame(np.reshape(np.arange(20),(5,4)).tolist(),columns=list('ABCD'))
df['E']=''
df.loc[0,'E']=1
df
  

До сих пор все так, как хотелось. Вывод:

     A   B   C   D  E
0   0   1   2   3  1
1   4   5   6   7   
2   8   9  10  11   
3  12  13  14  15   
4  16  17  18  19   
  

Проблема

Но теперь я хотел бы установить значение столбца ‘E’ в первой строке, для которого значение ‘B’ больше, чем от 8 до 3 (то же самое, df.loc[2,'E']=1 но с использованием этого условия. Я не знаю, какая это строка априори).

Попытки решения

Я пробовал разные вещи:

 df.loc[df['B']>8,'E'].iloc[0]=3
df
  

Это не меняет никакого значения:

     A   B   C   D  E
0   0   1   2   3  1
1   4   5   6   7   
2   8   9  10  11   
3  12  13  14  15   
4  16  17  18  19   
  

То же самое справедливо для

 df.loc[df['B']>8]['E'].iloc[0]=3
  

Другие вещи, которые я пробовал, приводят к ошибке. df.loc[df['B']>8,'E']=3 работает хорошо, но я хочу присвоить значение только в первой строке, удовлетворяющей условию, а не во всех строках.

Итак, как мне этого добиться?

Ответ №1:

Использовать .idxmax() . Поскольку True это максимальное значение True / False , оно вернет индекс первого True значения для логического индекса.

 df.loc[(df['B']>8).idxmax(),'E']=3
  

Комментарии:

1. Если я хочу присвоить значение первым трем строкам, есть ли какая-либо функция?

2. @YANGSULIU да, но, пожалуйста, откройте новый вопрос с вашим полным вопросом, включая минимальный воспроизводимый пример. Комментарии к несвязанному ответу — это не то место, где можно получить помощь.