Как перебрать pandas мультииндекса DataFrame и фильтрацию на основе другого значения столбца - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь выполнить итерацию по мультииндексу со следующим фреймом данных.

Изображение моего фрейма данных

По сути, я пытаюсь сделать следующее: уменьшите DataFrame до верхних QB, верхних 2 RB, верхних 3 WR и верхних TE на основе их значений в соответствующих столбцах «FantasyPoints» для каждой команды NFL. Я часами пытался понять, как это сделать, но не могу найти решение. Я попытался использовать groupby, но безуспешно, и подумал, что мне, возможно, придется перебрать мультииндекс, но я так и не понял. Заранее спасибо всем, кто может помочь мне разобраться в этом. Ниже приведен код, используемый для генерации DataFrame в его существующем состоянии. Вот ссылка на файл CSV, который используется. https://drive.google.com/file/d/1hX1Jmjk4RBxsH8tt8g1tqwKqrjZkFZp_/view?usp=sharing

#import our CSV file
df = pd.read_csv('2019.csv')

#drop unneccessary columns
df.drop(['Rk', '2PM', '2PP', 'FantPt', 'DKPt', 'FDPt', 
         'VBD', 'PosRank', 'OvRank', 'PPR', 'Fmb', 
         'GS', 'Age', 'Tgt', 'Y/A', 'Att', 'Att.1', 'Cmp', 'Y/R'], axis=1, inplace=True)

#fix name formatting
df['Player'] = df['Player'].apply(lambda x: x.split('*')[0]).apply(lambda x: x.split('\\')[0])

#rename columns
df.rename({
    'TD': 'PassingTD',
    'TD.1': 'RushingTD',
    'TD.2': 'ReceivingTD',
    'TD.3': 'TotalTD',
    'Yds': 'PassingYDs',
    'Yds.1': 'RushingYDs',
    'Yds.2': 'ReceivingYDs',
}, axis=1, inplace=True)

df['FantasyPoints'] = (df['PassingYDs']*0.04 + df['PassingTD']*4 - df['Int']*2 + df['RushingYDs']*.1 
                       + df['RushingTD']*6 + df['Rec']*1 + df['ReceivingYDs']*.1 + df['ReceivingTD']*6 - df['FL']*2)

df = df[['Tm', 'FantPos', 'FantasyPoints']]

df = df[df['Tm'] != '2TM']
df = df[df['Tm'] != '3TM']

df.set_index(['Tm', 'FantPos'], inplace=True)
df = df.sort_index()
df.head(30)

1 Ответ

0 голосов
/ 16 января 2020

Почему многоиндексность ?? Вы можете легко настроить словарь для перебора и получения первых n строк для каждого условия / позиции:

import pandas as pd

#import our CSV file
df = pd.read_csv('2019.csv')

#drop unneccessary columns
df.drop(['Rk', '2PM', '2PP', 'FantPt', 'DKPt', 'FDPt', 
         'VBD', 'PosRank', 'OvRank', 'PPR', 'Fmb', 
         'GS', 'Age', 'Tgt', 'Y/A', 'Att', 'Att.1', 'Cmp', 'Y/R'], axis=1, inplace=True)

#fix name formatting
df['Player'] = df['Player'].apply(lambda x: x.split('*')[0]).apply(lambda x: x.split('\\')[0])

#rename columns
df.rename({
    'TD': 'PassingTD',
    'TD.1': 'RushingTD',
    'TD.2': 'ReceivingTD',
    'TD.3': 'TotalTD',
    'Yds': 'PassingYDs',
    'Yds.1': 'RushingYDs',
    'Yds.2': 'ReceivingYDs',
}, axis=1, inplace=True)

df['FantasyPoints'] = (df['PassingYDs']*0.04 + df['PassingTD']*4 - df['Int']*2 + df['RushingYDs']*.1 
                       + df['RushingTD']*6 + df['Rec']*1 + df['ReceivingYDs']*.1 + df['ReceivingTD']*6 - df['FL']*2)

df = df[['Tm', 'FantPos', 'FantasyPoints']]

df = df[df['Tm'] != '2TM']
df = df[df['Tm'] != '3TM']


dictionary = {'QB':1,'RB':2,'WR':3,'TE':1}
results_df = pd.DataFrame()
for pos, n in dictionary.items():
    results_df = results_df.append(df[df['FantPos'] == pos].nlargest(n, columns='FantasyPoints'), sort=True).reset_index(drop=True)

Вывод:

print (results_df)

  FantPos  FantasyPoints   Tm
0      QB         415.68  BAL
1      RB         469.20  CAR
2      RB         314.80  GNB
3      WR         374.60  NOR
4      WR         274.10  TAM
5      WR         274.10  ATL
6      TE         254.30  KAN
...