簡體   English   中英

groupby和求和兩列並設置為pandas中的一列

[英]groupby and sum two columns and set as one column in pandas

我有以下數據框:

import pandas as pd
data = pd.DataFrame()
data['Home'] = ['A','B','C','D','E','F']
data['HomePoint'] = [3,0,1,1,3,3]
data['Away'] = ['B','C','A','E','D','D']
data['AwayPoint'] = [0,3,1,1,0,0]

我想按列['Home','Away']分組,並將名稱更改為Team。 然后我喜歡將歸宿和離去點的總和稱為“點”。

     Team      Points
      A           4
      B           0
      C           4
      D           1
      E           4
      F           3

我該怎么做? 我正在嘗試使用以下帖子的不同方法: 鏈接

但是我無法獲得想要的格式。

非常感謝您的建議。

謝謝

澤普。

一種簡單的方法是創建兩個由團隊索引的新系列:

home = pd.Series(data.HomePoint.values, data.Home)
away = pd.Series(data.AwayPoint.values, data.Away)

然后,您想要的結果是:

home.add(away, fill_value=0).astype(int)

請注意, home + away比賽不起作用,因為F隊從未比賽過,所以他們將被NaN淘汰。 因此,我們將Series.add()fill_value=0

一種復雜的方法是使用DataFrame.melt()

goo = data.melt(['HomePoint', 'AwayPoint'], var_name='At', value_name='Team')
goo.HomePoint.where(goo.At == 'Home', goo.AwayPoint).groupby(goo.Team).sum()

或從另一個角度來看:

ooze = data.melt(['Home', 'Away'])
ooze.value.groupby(ooze.Home.where(ooze.variable == 'HomePoint', ooze.Away)).sum()

您可以成對連接輸入數據框的列。 然后使用groupby.sum

# calculate number of pairs
n = int(len(df.columns)/2)+1)

# create list of pairwise dataframes
df_lst = [data.iloc[:, 2*i:2*(i+1)].set_axis(['Team', 'Points'], axis=1, inplace=False) \
          for i in range(n)]

# concatenate list of dataframes
df = pd.concat(df_lst, axis=0)

# perform groupby
res = df.groupby('Team', as_index=False)['Points'].sum()

print(res)

  Team  Points
0    A       4
1    B       0
2    C       4
3    D       1
4    E       4
5    F       3

暫無
暫無

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

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