簡體   English   中英

熊貓計算具有特定行和列的滾動總和

[英]Pandas calculating rolling sum with specific rows and columns

我有一個非常具體的問題。

例如,我正在嘗試分析一些歷史足球數據,並希望為每支球隊最近的主場和客場進球數創建幾列。 我試圖在這里簡化事情,假設df看起來像這樣:

df = pd.DataFrame({'Home':['A','B','C','B','A','A','C'],'Away':['B','C','A','C','B','B','A'],
                   'HG':[1,2,3,2,1,4,1],'AG':[2,4,5,1,3,2,2]})
  Home Away  HG  AG
0    A    B   1   2
1    B    C   2   4
2    C    A   3   5
3    B    C   2   1
4    A    B   1   3
5    A    B   4   2
6    C    A   1   2

我想要做的是對 df 中每一行的 Home 和 Away 的最近兩個目標數字( HG和/或AG )求和。 但我顯然不想考慮最近的一行。

因此,如果我們查看索引行 0。Home 是“A”。 我希望得到的數字是 6,AG 下索引第 2 行的 5 個,因為 A 是本行的客隊,索引第 4 行的 1 個,因為 A 是主隊,總共等於 6。 對於索引行 0 中的客隊 B,我希望結果是 4,來自索引行 1 和索引行 3。依此類推。 如果要計算的數據點少於 2 個,我還想返回np.NaN

我最初想可能會寫一個小函數來幫助做到這一點,與此類似,但顯然這是非常不正確的:

def get_rolling_sum(x):
    count_list = []
    new_df = df[(df['Home'] == str(x)) | (df['Away'] == str(x))]
    for i in range(0,len(new_df)):
        if new_df['Home'].iloc[i] == str(x):
            count_list.append(new_df['HG'].iloc[i])
        elif new_df['Away'].iloc[i] == str(x):
            count_list.append(new_df['AG'].iloc[i])
df['Roll_Home'] = [get_rolling_sum(x) for x in df['Home']]

我希望得到的是這樣的:

  Home Away  HG  AG  Expected_Home
0    A    B   1   2            6.0
1    B    C   2   4            5.0
2    C    A   3   5            2.0
3    B    C   2   1            5.0
4    A    B   1   3            6.0
5    A    B   4   2            NaN
6    C    A   1   2            NaN

非常感謝

首先讓我們向數據框中添加一列,以便行索引可用。 然后創建一個堆疊的數據框,使 Home 和 Away 列成為一列,HG 和 AG 列成為一個列,同時保持索引不變。 基本上來自原始 df 的 Home 和 Away 值將成為兩個連續的行。 然后從堆疊數據框中取出參考索引大於原始索引的最近兩行並添加目標。 (您必須手動制作最后兩行 NaN)。

df = pd.DataFrame({'Home':['A','B','C','B','A','A','C'],'Away':['B','C','A','C','B','B','A'],
               'HG':[1,2,3,2,1,4,1],'AG':[2,4,5,1,3,2,2]})[['Home', 'Away', 'HG', 'AG']]
df['ref_index'] = df.index

df_stack = pd.concat([df[['Home', 'HG']].rename(columns = {'Home':'Loc', 'HG':'Goals'}), 
                  df[['Away', 'AG']].rename(columns = {'Away':'Loc', 'AG':'Goals'})]).sort_index(kind='merge')
df_stack['ref_index'] = df_stack.index

df['Expected_Home'] = df.apply(lambda row: df_stack[(df_stack.Loc == row['Home']) & 
                                                (df_stack.ref_index > row['ref_index'])].iloc[:2].Goals.sum(),
                           axis = 1)

print(df)

     Home   Away    HG  AG  ref_index   Expected_Home
   0    A      B    1   2          0    6
   1    B      C    2   4          1    5
   2    C      A    3   5          2    2
   3    B      C    2   1          3    5
   4    A      B    1   3          4    6
   5    A      B    4   2          5    2
   6    C      A    1   2          6    0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM