当前位置: 首页 > 知识库问答 >
问题:

groupby和sum两列,并设置为表中的一列

堵雅健
2023-03-14

我有以下数据框:

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。然后我喜欢将原点和awaypoint相加作为点的名称。

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

我怎么做?我尝试了不同的方法,使用下面的帖子:Link

但我无法得到我想要的格式。

非常感谢你的建议。

谢谢

泽普。

共有2个答案

锺威
2023-03-14

您可以成对连接输入数据帧的列。然后使用groupby。求和

# 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
晏晨朗
2023-03-14

一个简单的方法是创建两个由团队索引的新系列:

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

然后,您想要的结果是:

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

请注意,主客场不起作用,因为F队从未踢过客场比赛,所以会给他们造成NaN。所以我们使用系列。使用填充值=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()

 类似资料:
  • 当我分组和求和时,我怎样才能绕过这个并保留C栏呢?

  • 我有一个类的列表,它具有以下属性: 现在,我想按(字符串)对列表进行分组,并获得的总和,该总和将成为每个的新。 因为我使用的是Java 8,所以应该是应该走的路。 Groupby应该使用以下代码非常简单: 如果我想通过SmartNo分组并在SettlementAmount上求和后获得一个新列表,该怎么办?这里的大多数例子只展示了如何打印出总和。我感兴趣的是如何获得聚合列表?

  • 我有一堆数据帧,我连接成一个大数据帧。所有行都有一个datetime、一个名称,然后是一些具有随机值的列,例如,数据帧可以如下所示: 现在,我需要按对这些行进行分组,并将它们分成60分钟的bins,我目前的做法如下: 这可以用任何方式来完成吗?或者我必须将我的数据帧一分为二,然后在之后加入?

  • Java8在收集器中提供了一个groupingBy函数,但它给出了元素的映射。我需要把地图转换成单个列表。 它还返回结果,但我想要的是对列表本身执行分组操作,这样我就不必重新分配它,因为在lambda表达式中不可能重新分配。 但是nodelistgrouped.values()返回Collection(List)

  • 问题内容: 我有 我想要 问题答案:

  • 问题内容: 我有第1列和第2列,并希望将它们合并到同一表的第3列中。如果第2列为空,则显示第1列的值;如果第1列为空,则它们显示第2列的数据。如果它们都为空,则显示为空。我尝试了两件事: 1)使用CONCAT 。 仅当两个列都不为null时,它才合并列。否则,它只是将null声明为null。 2)使用(第1栏+第2栏)。 。 没有显示所需的输出。 我正在用Java编写此代码。谢谢 问题答案: us