聚合数据并获取总和和计数

4
我有一个在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 吗? - Anton Protopopov
不好意思,我不知道那个。 - John Doe
根据建议,看一下pandas包,将数据放入DataFrame中,它可以制作透视表,或者只使用groupby函数。http://pandas.pydata.org - alex314159
“team”,“player”,“trips”,“time”是列表吗?还是可以将它们放入列表中? - ilyas patanam
我可以将它们放入列表中。 - John Doe
你能安装包吗,具体来说,你能执行 pip install pandas 吗? - ilyas patanam
1个回答

8
使用groupby函数处理pandas数据框
  1. Put your data into a list of lists, each inner list will be a row in the dataframe.

    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(), pass the column you wish to use as your grouper, and apply a function to the groups.


示例

示例1 找出每个团队参加的旅行次数。 team 是分组器,我们在列 ['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(多列):查找团队中每个球员花费在旅行上的总时间。我们使用两列['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 (多个功能) 对于团队中的每个玩家,找到旅行总次数和总旅行时间。

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; Player293 1 17656; Player333 1 18373(而不是2行)。非常感谢您的帮助。 - John Doe
@John Doe 欢迎来到StackOverflow,很高兴能帮助你!由于问题被标记为过于宽泛,而我的答案又变得很长,我认为最好将答案分成两部分。如果想要了解如何在一行中打印所有内容,请参考这里。我使用了这个答案来展示如何使用pandas获取总和和计数。如果可以的话,请尝试相应地编辑您的帖子。如果这个答案或其他任何一个答案解决了您的问题,请将其标记为已接受。谢谢。 - ilyas patanam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接