繁体   English   中英

如何基于另一个列值迭代 Pandas DataFrame 多索引和过滤

[英]How to iterate over pandas DataFrame multi-index and filtering based off another column value

我正在尝试使用以下 DataFrame 迭代多索引。

我的数据帧的图片

本质上,我想要做的是根据每个 NFL 球队各自的“FantasyPoints”列中的值,将 DataFrame 减少到前 QB、前 2 名 RB、前 3 名 WR 和前 TE。 我一直试图弄清楚如何做到这一点,但无法想出一个解决方案。 我尝试使用 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)

为什么要做多索引?? 您可以轻松设置字典以遍历并获取每个条件/位置的前 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)

输出:

打印(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM