Фильтрация фрейма данных с помощью индекса строки (условного) другого фрейма и объединение этой строки - PullRequest
0 голосов
/ 01 марта 2020

df_1 - тестовый набор данных. Он содержит имена и навыки игроков (числовое значение).

df_1 <- data.frame(Name=c('S. Becker','A. Dabasse','S. Yesil','Jeon Se Jin','Nicholas Aldair'),
                   `Weak Foot`=c(3,3,3,4,3),
                   `Skill Moves`=c(3,2,3,3,3),
                   Crossing=c(60,29,35,51,66),
                   Finishing=c(57,59,71,65,75),
                   HeadingAccuracy=c(42,62,48,54,72),
                   ShortPassing=c(60,57,58,61,74) )


# Name              Weak.Foot   Skill.Moves Crossing  Finishing HeadingAccuracy ShortPassing
# S. Becker         3           3           60        57              42           60
# A. Dabasse        3           2           29        59              62           57
# S. Yesil          3           3           35        71              48           58
# Jeon Se Jin       4           3           51        65              54           61
# Nicholas Aldair   3           3           66        75              72           74

После прогнозирования «позиции» для этих данных с использованием модели (multi logisti c) я получаю второй кадр данных df_2. Очевидно, что, поскольку это модель Lo git, они, вероятно, находятся в этой конкретной позиции. (DEF FWD MID)


df_2 <- data.frame( DEF=c(5.73E-04,5.46E-06,2.08E-06,8.76E-06,6.56E-05),
                    FWD=c(0.4489639,0.9057274,0.9862491,0.9322038,0.8389187),
                    MID=c(0.55046347,0.09426718,0.01374878,0.06778743,0.16101569))


# DEF          FWD       MID
# 5.726046e-04 0.4489639 0.55046347
# 5.455446e-06 0.9057274 0.09426718
# 2.076482e-06 0.9862491 0.01374878
# 8.758119e-06 0.9322038 0.06778743
# 6.564988e-05 0.8389187 0.16101569

Мне нужно отобразить только строки df_1 с индексом df_2, где значения MID находятся в верхних 2, вместе с этой строкой MID включены.

Желаемый выход

# Name              Weak.Foot   Skill.Moves Crossing  Finishing HeadingAccuracy ShortPassing  MID 
# S. Becker         3           3           60        57              42           60         0.55046347
# Nicholas Aldair   3           3           66        75              72           74         0.16101569

Ответы [ 3 ]

4 голосов
/ 01 марта 2020

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

library(dplyr)
cbind(df_1,select(df_2,MID)) %>% 
  arrange(desc(MID)) %>% 
  slice(1:2)
#>              Name Weak.Foot Skill.Moves Crossing Finishing HeadingAccuracy ShortPassing       MID
#> 1       S. Becker         3           3       60        57              42           60 0.5504635
#> 2 Nicholas Aldair         3           3       66        75              72           74 0.1610157
2 голосов
/ 01 марта 2020

Использование order.

cbind(df_1, df_2[3])[order(-df_2$MID)[1:2], ]
#              Name Weak.Foot Skill.Moves Crossing Finishing HeadingAccuracy ShortPassing       MID
# 1       S. Becker         3           3       60        57              42           60 0.5504635
# 5 Nicholas Aldair         3           3       66        75              72           74 0.1610157
1 голос
/ 01 марта 2020

Вы можете легко получить второе лучшее значение, заказав столбец «MID» и получив доступ ко второму ряду с помощью ilo c. Затем вы объединяете два блока данных по индексу (я предполагаю, что оба блока данных имеют одинаковый порядок). Если индексы не совпадают, вы можете сначала сбросить их, используя df_1.reset_index(drop=True) и df_2.reset_index(drop=True). Наконец, вам просто нужно применить условие фильтра.

import pandas as pd

threshold = df_2['MID'].sort_values(ascending=False).iloc[1]
df = df_1.join(df_2['MID'])
result = df[df['MID'] >= threshold]
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...