Pandas: добавьте новый столбец с подсчетом, как часто этот человек набирал наибольшее количество очков за день

#python #pandas #dataframe #numpy

#python #pandas #фрейм данных #numpy

Вопрос:

Это pandas / Dataframe, он содержит все оценки для всех каждый день, я хочу добавить один дополнительный столбец, чтобы узнать, сколько раз он набирал наибольшее количество баллов (может быть более одного человека, и некоторые данные есть nan )

 import pandas as pd
import numpy as np

data = np.array([['','day1','day2','day3','day4','day5'],
                ['larry',1,4,7,3,5],
                ['niko',2,-1,3,6,4],
                ['tin',np.nan,5,5, 6,7]])
                
df = pd.DataFrame(data=data[1:,1:],
                  index=data[1:,0],
                  columns=data[0,1:])
print(df)
 

вывод

       day1 day2 day3 day4 day5
larry    1    4    7    3    5
niko     2   -1    3    6    4
tin    nan    5    5    6    7
 

ожидаемый результат (Ларри: 1 раз, Нико: 2 раза, tin: 3 раза)

       times_of_top day1 day2 day3 day4 day5
larry            1    1    4    7    3    5
niko             2    2   -1    3    6    4
tin              3  nan    5    5    6    7
 

niko имеет наивысший балл day1 , и day4 поэтому его times_of_top значение равно 2.
tin имеет наивысший балл day2 , day4 и day5 поэтому его times_of_top значение равно 3.

Ответ №1:

Один из способов использования pandas.DataFrame.stack и count :

 # df = df.astype(float)
# Since the sample data are in object type

df["times_of_top"] = df[df == df.max()].stack().count(0)
print(df)
 

Вывод:

        day1  day2  day3  day4  day5  times_of_top
larry   1.0   4.0   7.0   3.0   5.0             1
niko    2.0  -1.0   3.0   6.0   4.0             2
tin     NaN   5.0   5.0   6.0   7.0             3
 

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

1. @LarryCai — вы конвертировали в float, как в комментарии

2. нет, но в качестве ответа ок. @Chris может обновить его.