Pandas: применить функцию к нескольким столбцам

#python #pandas

#python #pandas

Вопрос:

Я пытаюсь добавить новый столбец, вычисленный из первого квартиля всех столбцов. что-то вроде этого:

 df['Q25']=df[col].apply(lambda x: np.percentile(x, 25) ,axis =1)
#col = ['1', '2','3',..'29'] days in one month
  

и это ошибка, которую я получаю:

 KeyError: "['1' '2' '3' '4' '5' '6' '7' '8' '9' '10' '11' '12' '13' '14' '15' '16'n '17' '18' '19' '20' '21' '22' '23' '24' '25' '26' '27' '28' '29'] not in index"
  

Я понимаю, что ошибка показывает, что python пытается найти переданный список (col) в индексе вместо самих столбцов, но я не знаю, как мне это исправить. Я уже добавил axis= 1, но безуспешно.

PS. Я не могу добавить столбец вручную, например df['1'], df['2'] , поскольку общее число (в данном случае 29) изменяется в других случаях.

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

1. Что такое df.columns ?

2. @NickilMaveli Int64Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], dtype='int64', name='Day')

Ответ №1:

Попробуйте это :

 df['Q25']= [np.percentile(df.loc[i,:], 25) for i in df.index]
  

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

1. Спасибо за ответ, но он не работает: TypeError: unhashable тип: ‘slice’

2. Еще один момент: ваш код использует индекс (строки), в то время как я хочу рассмотреть столбцы. Я изменил ваш код на это: df['Q25']= [np.percentile(df[:,i], 25) for i in map(lambda l : str(l), df.columns)] и получил ту же ошибку : TypeError: unhashable type: 'slice'

3. Вы не можете добавить столбец к своему df размеру размером df.columns . Это ничего не значит. Формы не совпадают. Возможно, вы захотите добавить новую строку …

4. Еще раз спасибо, но и новый код (без изменения его для столбцов) приводит к той же ошибке

5. Мой плохой, я попробовал это снова, и это работает. Плохая новость (для меня!) Заключается в том, что для строк, содержащих NaN, значение Q25 равно NaN, но это другая проблема, и я попытаюсь ее найти. Большое спасибо за вашу помощь — и извините, что я не могу проголосовать за ваш ответ, моя репутация настолько низка из-за этого!