【问题标题】:Aggregating data and getting sum and counts [closed]聚合数据并获取总和和计数[关闭]
【发布时间】:2016-04-01 05:22:07
【问题描述】:

我在 python 中有一个包含很多行的对象:

输入:

    Team1     Player1     idTrip13     133
    Team2     Player333   idTrip10     18373
    Team3     Player22    idTrip12     17338899
    Team2     Player293   idTrip02     17656
    Team3     Player20    idTrip11     1883
    Team1     Player1     idTrip19     19393

我需要汇总这些数据(如数据透视表)。

我正在处理的输出:

Team1   Player1 : 2 trips : sum(133+19393)
Team2   Player333 : 1 trip : 18373; Player293 : 1 trip : 17656
Team3   Player22 : 1 trip : 17338899; Player20 : 1 trip : 1883

有人可以建议使用 Python 中的适当对象,以便我可以得到以下输出吗?

print team, player, trips, time

【问题讨论】:

  • 你在用pandas吗?
  • 不,我不知道
  • 按照建议,查看 pandas 包,将数据放在 DataFrame 中,它可以做数据透视表,或者只使用 groupby 函数。 pandas.pydata.org
  • teamplayertripstime 列表还是可以将它们放入列表中?
  • 我可以把它们放在列表中

标签: python pandas group-by aggregate


【解决方案1】:

pandas DataFrames使用groupby函数

  1. 将您的数据放入列表列表中,每个内部列表将是数据框中的一行。

    In[1]:
    
    mydata = [['Team1', 'Player1', 'idTrip13', 133], ['Team2', 'Player333', 'idTrip10', 18373],
    ['Team3', 'Player22', 'idTrip12', 17338899], ['Team2', 'Player293','idTrip02', 17656], 
    ['Team3', 'Player20', 'idTrip11', 1883], ['Team1', 'Player1', 'idTrip19', 19393]]
    
    df = pd.DataFrame(mydata, columns = ['team', 'player', 'trips', 'time'])
    
    df
    Out[1]:
         team    player       trips      time
    0   Team1   Player1     idTrip13    133
    1   Team2   Player333   idTrip10    18373
    2   Team3   Player22    idTrip12    17338899
    3   Team2   Player293   idTrip02    17656
    4   Team3   Player20    idTrip11    1883
    5   Team1   Player1     idTrip19    19393
    
  2. Call groupby(),传递您希望用作石斑鱼的列, 并将函数应用于组。


例子

例如。 1 找出每个团队进行的旅行次数。 team 是grouper,我们在['trips'] 列上应用函数count()

In[2]:
trip_count = df.groupby(by = ['team'])['trips'].count() 

trip_count              
Out[2]:          

 team
Team1    2
Team2    2
Team3    2
Name: trips, dtype: int64

例如。 2(多列):计算团队中每位球员旅行的总时间。我们使用2列['team', 'player']作为分组器,并在['time']列上应用函数sum()

In[3]:              
trip_time = df.groupby(by = ['team', 'player'])['time'].sum() 

trip_time        
Out[3]:

 team   player   
Team1  Player1         19526
Team2  Player293       17656
       Player333       18373
Team3  Player20         1883
       Player22     17338899
Name: time, dtype: int64

例如。 3 (multiple functions) 对于团队中的每个玩家,求出总旅行次数和总旅行时间。

player_total = df.groupby(by = ['team', 'player']).agg({'time' : 'sum', 'trips' : 'count'})

player_total
Out[4]:
                 trips  time
team    player      
Team1   Player1     2   19526
Team2   Player293   1   17656
        Player333   1   18373
Team3   Player20    1   1883
        Player22    1   17338899

【讨论】:

  • 您好,谢谢它有效。但我需要有,例如 Team2;播放器293 1 17656; Player333 1 18373 在同一行(而不是 2 行)。非常感谢您的帮助
  • @John Doe 很高兴为您提供帮助,欢迎来到 StackOverflow!由于这个问题被标记为太宽泛,我的答案变得很长,我认为将答案分成 2 可能会更好。要了解如何在一行中打印所有内容,请参阅here。我用这个答案来展示如何使用 pandas 来获取总和和计数。如果可以,请尝试相应地编辑您的帖子。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。谢谢。
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 2021-03-21
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多