фильтрация данных в pandas, где строка находится в нескольких столбцах - PullRequest
0 голосов
/ 11 июля 2020

У меня есть фрейм данных, который выглядит следующим образом:

team_1  score_1 team_2  score_2
AUS     2       SCO     1
ENG     1       ARG     0
JPN     0       ENG     2

Я могу получить все данные из одной команды, используя: # список, определяющий интересующую команду

team = ['ENG']

# разрезать фрейм данных, чтобы отобразить только те строки, в которых значение столбца 'Team 1' или 'Team 2' находится в указанном списке строк 'team'

df.loc[df['team_1'].isin(team) | df['team_2'].isin(team)]
team_1  score_1 team_2  score_2
ENG     1       ARG     0
JPN     0       ENG     2

Как я могу теперь возвращать только очки моей «команды», например:

team    score
ENG     1
ENG     2

Может быть, создать индекс для каждой команды, чтобы отфильтровать? Может быть, кодировать столбцы team_1 и team_2 для фильтрации?

Ответы [ 2 ]

3 голосов
/ 11 июля 2020
new_df_1 = df[df.team_1 =='ENG'][['team_1', 'score_1']]
new_df_1 =new_df_1.rename(columns={"team_1":"team", "score_1":"score"})
#   team  score
#  0  ENG      1

new_df_2 = df[df.team_2 =='ENG'][['team_2', 'score_2']]
new_df_2 = new_df_2.rename(columns={"team_2":"team", "score_2":"score"})
#  team  score
# 1  ENG      2

затем объедините два фрейма данных:

pd.concat([new_df_1, new_df_2])

, на выходе получится:

 team  score
0  ENG      1
1  ENG      2

0 голосов
/ 11 июля 2020

Расплавить столбцы, отфильтровать для значений в команде, вычислить сумму столбца баллов и отфильтровать только команды и баллы:

 team = ["ENG"]

(
    df
    .melt(cols, value_name="team")
    .query("team in @team")
    .assign(score=lambda x: x.filter(like="score").sum(axis=1))
    .loc[:, ["team", "score"]]
)

    team    score
1   ENG        1
5   ENG        2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...