打印多重索引的每个级别中的所有行pd数据帧在上

2024-06-16 09:53:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,它在执行groupby()aggregation之后被转换为多索引数据帧。在

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

对于团队中的每个成员,找出旅行的总次数和旅行的总时间。这将返回一个多索引数据帧。在

^{pr2}$

期望输出: 我想打印输出,这样一个团队中的所有球员都在同一条线上。在

Team1   Player1 : 2 trips : 19526;
Team2   Player293 : 1 : 17656; Player333 : 1 : 18373;
Team3   Player22 : 1 trip : 17338899; Player20 : 1 trip : 1883

这个question被认为过于宽泛,所以我随意地将pandas数据帧的创建/聚合从输出打印中分离出来。在


Tags: 数据tripsmydataplayer1team1team2team3player333
1条回答
网友
1楼 · 发布于 2024-06-16 09:53:57
  1. 使用groupby()迭代第0级(团队)。在

    for team, df2 in player_total.groupby(level = 0):
    

    例如,在第二次迭代中,它将返回Team2的数据帧:

                    trips   time
    team  player              
    Team2 Player293     1  17656
          Player333     1  18373
    
  2. 使用reset_index()删除团队索引列,并将player索引列作为dataframe的一部分。在

    >>>team_df = df2.reset_index(level = 0, drop = True).reset_index()
    >>>team_df
          player  trips   time
    0  Player293     1  17656
    1  Player333     1  18373
    
  3. 把这个数据帧转换成一个列表列表,这样我们就可以遍历每个播放器。在

    team_df.values.tolist()
    >>>[['Player293', 1, 17656], ['Player333', 1, 18373]]
    
  4. 打印时,我们必须将整数映射到字符串,并使用print函数的end参数打印分号,而不是在末尾打印新行。在

    >>>for player in team_df.values.tolist():
           print(': '.join(map(str, player)), end = '; ')
    >>>Player293: 1: 17656; Player333: 1: 18373; 
    

完整解决方案:

from __future__ import print_function

#iterate through each team
for team, df2 in player_total.groupby(level = 0):
    print(team, end = '\t')
    #drop the 0th level (team) and move the first level (player) as the index
    team_df = df2.reset_index(level = 0, drop = True).reset_index()
    #iterate through each player on the team and print player, trip, and time
    for player in team_df.values.tolist():
        print(': '.join(map(str, player)), end = '; ')
    #After printing all players insert a new line
    print()

输出:

Player1: 2: 19526; 
Player293: 1: 17656; Player333: 1: 18373; 
Player20: 1: 1883; Player22: 1: 17338899; 

相关问题 更多 >