Как получить значения, а также количество строк, имеющих это конкретное значение, которое получено из нескольких условий в панде dataframe? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть пандас датафрейм

Id  drove   swimmed walked  winPerc
0   247.3   1050    782.4   1
1   37.65   1072    119.6   0.04
2   93.73   1404    3248    1
3   95.88   1069    21.49   0.1146
4   0       1034    640.8   0
5   128.1   1000    1016    0.9368

average 100.4433333 1104.833333 971.3816667 
Min     0           1000        21.49   
max     247.3       1404        3248`

winPerc = 1 означает, что игрок выиграл с 1-м рангом, аналогично winPerc = 0 говорит нам, что игрок пришел последним

print("The person who ends up winning the match usually drives {:.2f} , swims {:.2f} meters, has a walked {} meters".format(df.set_index('drove')['winPerc'].idxmax(),df.set_index('swimmed')['winPerc'].idxmax(),df.set_index('walked')['winPerc'].idxmax()))

за это я получаю: -

IndexError: индекс кортежа вне диапазона

Что я хочу, так это то, как вы можете видеть на приведенном выше кадре данных, строки с идентификаторами 0 и 2 имеют winPerc = 1, я должен получить ответ: The person who ends up winning the match usually drives 170.52 , swims 1227 meters, has a walked 2015.2 meters И если было несколько записей с winPerc = 1, то я должен получить значения соответственно

Также могут быть игроки, которые могли не ездить (ехал = 0) и,

выиграли игру (winPerc = 1)

print("{} number of confident Players won without driving".format(len(df['drove'].min()['winPerc'].idxmax())))

Для этого я получаю эту ошибку: -

IndexError: недопустимый индекс для скалярной переменной.

Если , в случае нет строки, у которой есть значение столбца min () или max () или mean (), тогда я должен взять значения, которые имеют близкие значения, которые близки к этому конкретному случай.

Заранее спасибо, и дайте мне знать, если я должен объяснить больше. :)

1 Ответ

0 голосов
/ 31 октября 2018

Я скопировал первый отпечаток, ничего не меняя, и он прекрасно работает для меня:

The person who ends up winning the match usually drives 247.30 , swims 1050.00 meters, has a walked 782.4 meters.

Когда вы используете .format() и получаете IndexError: tuple out of range, это означает, что вы вызываете его с использованием слишком небольшого числа переменных.


Для второй проблемы вам нужно отфильтровать DataFrame. Это может быть выполнено различными способами, распространенным является использование логического маскирования.

>> drove_is_0 = df["drove"] == df['drove'].min()
>> is_winner =  df['winPerc'] == df['winPerc'].idxmax()

Затем примените свои фильтры к вашему DataFrame:

>> filtered = df[drove_is_0 & is_winner]

Последняя печать:

>> print("{} number of confident Players won without driving".format(len(filtered)))
1 number of confident Players won without driving

ОП пояснил, что первый вопрос был не о поднятом IndexError, а скорее о фильтрации. Они хотят отфильтровать df в столбце winPerc, где значение равно 1, а затем вычислить значения mean для разных столбцов. Я буду использовать логическую маскировку, как показано выше для согласованности:

>> is_winner = df["winPerc"] == 1

>> mean_driven_winner = df[is_winner]["drove"].mean()
>> mean_swimmed_winner = df[is_winner]["swimmed"].mean()
>> mean_walked_winner = df[is_winner]["walked"].mean()

>> print("The person who ends up winning the match usually drives {:.2f} , swims {:.2f} meters, has a walked {} meters".format(
    mean_driven_winner, mean_swimmed_winner, mean_walked_winner)
)

The person who ends up winning the match usually drives 170.52 , swims 1227.00 meters, has a walked 2015.2 meters
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...