繁体   English   中英

Pandas - 将多个组行合并为一行

[英]Pandas - Combine multiple group rows into one row

我一直在撞墙一段时间,现在试图弄清楚 Pandas 中这个看似简单的数据操作任务,但是我没有成功弄清楚如何做到这一点或谷歌搜索足够的答案:(

我要做的就是取下面片段左侧的表格(将是 pandas 数据帧)并将其转换为右侧的表格(成为另一个 pandas 数据帧)。

在此处输入图像描述

用于创建初始 dataframe 的代码:

import pandas as pd

test_data = pd.DataFrame(
        {
            'team': [1,1,2,2,3,3,4,4,5,5] ,
            'player': ['a','b','c','d','e','f','g','h','i','j'] ,
            'score': [10,22,66,44,1,3,55,6,4,2]
        }
)

提前谢谢你的帮助!

尝试这个,

test_data.groupby('team').agg({'player':['first', 'last'], 'score': ['first', 'last']})

输出/输出:

    player_first player_last  score_first  score_last
team                                                  
1               a           b           10          22
2               c           d           66          44
3               e           f            1           3
4               g           h           55           6
5               i           j            4           2

完整的解决方案:

test_data = test_data.groupby('team').agg({'player':['first', 'last'], 'score': ['first', 'last']})
test_data.columns = ['_'.join(x) for x in test_data.columns]
test_data = test_data.reset_index()
test_data = test_data[['team', 'player_first', 'score_first', 'player_last', 'score_last']]

输出/输出:

   team player_first  score_first player_last  score_last
0     1            a           10           b          22
1     2            c           66           d          44
2     3            e            1           f           3
3     4            g           55           h           6
4     5            i            4           j           2​
  • 您需要的是 groupby 和 first 和 last 的聚合操作
  • 设置列名
  • 重置索引并重新排序列

假设您的 dataframe 是按团队排序的,并且您知道每个团队正好有 2 个条目,您可以使用:

player_1_data = test_data.iloc[::2, :]
player_2_data = test_data.iloc[1::2, :]

player_1_data.set_index("team")
.add_suffix("1")
.join(player_2_data.set_index("team").add_suffix("2"))
.reset_index()
.rename({"score1": "player1_score", "score2": "player2_score"}, axis=1)

在这里,我们只是选择交替的行并将它们连接在一起以给出:

   team player1  player1_score player2  player2_score
0     1       a             10       b             22
1     2       c             66       d             44
2     3       e              1       f              3
3     4       g             55       h              6
4     5       i              4       j              2

你可以这样做:

import pandas as pd

df = pd.DataFrame(
        {
            'team': [1,1,2,2,3,3,4,4,5,5] ,
            'player': ['a','b','c','d','e','f','g','h','i','j'] ,
            'score': [10,22,66,44,1,3,55,6,4,2]
        }
)
grouped_df = df.groupby('team').agg({ 'player': ['first', 'last'], 'score': ['first', 'last']})
grouped_df.columns = [ 'player_first', 'score_first', 'player_last', 'score_last']
print(grouped_df) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM