亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pandas - 功能有條件地更新下一行的某些列

Pandas - 功能有條件地更新下一行的某些列

慕斯王 2021-12-26 15:18:12
我有 csv 文件,其中包含來自不同足球比賽的大量結果。數據類似于下面的示例。該result列可以包含 3 個可能的值:H -> 主隊獲勝(主隊獲得+3分)A -> 客隊獲勝(客場將獲得 + 3 分)D -> 平局(兩隊均獲得 +1 分)   HomeTeam    AwayTeam Result0   FC_Fake  ABC_United      H1  Team_123   FC_Berlin      A2   FC_FAKE    TEAM_123      D我想更新文件,以便每一行都包含每支球隊的總積分as they are at the start of the match(因此尚未更新該行本身的比賽結果)我使用以下代碼更新數據框,因此它包含points_[TEAM_NAME]每個團隊的虛擬列。# Teams is a python list I extracted earlierfor team in teams:    df['points_' + team] = 0目標是轉換數據幀,使上面的例子變成下面的例子。(同樣,分數應該代表比賽開始時的情況。所以即使FC_FAKE在第一行贏得比賽,Points_FC_FAKE列也是 0 )HomeTeam | AwayTeam | Result  Points_FC_FAKE | Points_TEAM_123 | Points_FC_Berlin |  etc------------------------------------------------------------------------------- FC_Fake  ABC_United    H         0                  0             0 Team_123 FC_Berlin     A         3                  0             0 FC_FAKE  Team_123      D         3                  0             3我創建了以下 python 函數,如果它遍歷數據幀中的所有行,則應解析結果并將正確的點數獎勵給正確的團隊。def point_updater(x):    if x['Result'] == 'H':                home = x['HomeTeam']        x.shift(-1)['points_' + home] += 3        return x    elif x['Result'] == 'A':                away = x['AwayTeam']        x.shift(-1)['points_' + away] += 3        return x    elif x['Result'] == 'D':                home = x['AwayTeam']        away = x['AwayTeam']        x.shift(-1)['points_' + home] += 1        x.shift(-1)['points_' + away] += 1        return x問題是當我將此函數應用于數據幀時,點不會改變(全部保持為 0)df = df.apply(point_counter, axis=1)df['points_FC_Fake'].value_counts()----0    2691有誰知道我做錯了什么?
查看完整描述

3 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

在某些例外情況下,我們可以使用iterrows它。另外,在開始計算之前,我通過進行一些清理使您的代碼更具故障證明性和通用性:


# Convert to uppercase letters 

df['HomeTeam'] = df['HomeTeam'].str.upper()

df['AwayTeam'] = df['AwayTeam'].str.upper()


# get a list off all the teams in competition

lst_teams = list(set(list(df.HomeTeam.unique()) + list(df.AwayTeam.unique())))


# Create columns for each team

for team in lst_teams:

    df[team] = 0


# Iterate over each row and assign correct points

for idx, r in df.iterrows():

    if r['Result'] == 'H':

        df.loc[[idx], [r['HomeTeam']]] = 3

    if r['Result'] == 'A':

        df.loc[[idx], [r['AwayTeam']]] = 3

    if r['Result'] == 'D':

        df.loc[[idx], [r['AwayTeam']]] = 1

        df.loc[[idx], [r['HomeTeam']]] = 1


# Shift the rows one down, since points are only available at start of match

df.iloc[:, 3:] = df.iloc[:, 3:].cumsum().shift(1).fillna(0).astype(int)

輸出


print(df)

   HomeTeam    AwayTeam Result  ABC_UNITED  TEAM_123  FC_FAKE  FC_BERLIN

0   FC_FAKE  ABC_UNITED      H           0         0        0          0

1  TEAM_123   FC_BERLIN      A           0         0        3          0

2   FC_FAKE    TEAM_123      D           0         0        3          3


查看完整回答
反對 回復 2021-12-26
?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

可能有一種更簡潔的方式來執行這些操作,但現在應該足夠了。您可以使用df.replace()將Result鍵映射到它們的關聯值,然后使用pd.concat()和pd.DataFrame.pivot()實現您想要的結果:


import pandas as pd


df = pd.DataFrame({'HomeTeam': ['FC_Fake','Team_123','FC_Fake'], 'AwayTeam': ['ABC_United','FC_Berlin','Team_123'], 'Result': ['H','A','D']})


remap = df.replace({'H': 3, 'A': 3, 'D': 1})


new = pd.concat([remap.pivot(columns='HomeTeam', values='Result'), remap.pivot(columns='AwayTeam', values='Result')], axis=1).shift(1).fillna(0).astype(int).cumsum()


final = pd.concat([df, new], axis=1)

產量:


   HomeTeam    AwayTeam Result  FC_Fake  Team_123  ABC_United  FC_Berlin  \

0   FC_Fake  ABC_United      H        0         0           0          0   

1  Team_123   FC_Berlin      A        3         0           3          0   

2   FC_Fake    Team_123      D        3         3           3          3   


   Team_123  

0         0  

1         0  

2         0 


查看完整回答
反對 回復 2021-12-26
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

將您的功能更改為:


def point_updater(x):

    if x['Result'] == 'H':    

        home = x['HomeTeam']

        x['points_' + home] += 3

        return x


    elif x['Result'] == 'A':        

        away = x['AwayTeam']

        x['points_' + away] += 3

        return x


    elif x['Result'] == 'D':        

        home = x['HomeTeam']

        away = x['AwayTeam']

        x['points_' + home] += 1

        x['points_' + away] += 1

        return x

然后在代碼的末尾添加:


df = df.apply(point_updater,axis=1)

for team in teams:

    df["points_" + team]= df["points_" + team].cumsum()


查看完整回答
反對 回復 2021-12-26
  • 3 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號