#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 может обновить его.