如何在 pandas df 中每隔一行创建新列
How to make new columns out of every second row in a pandas df
我有一个 NBA 数据的数据框,我很难处理它。我想将 df1 更改为 df2,方法是让两支球队及其得分在同一行中两次,以类似于从两支球队的角度来看的比赛结果:
df1
GameID TeamID TeamAbb PTS
0 1001 TOR 99
0 1023 ATL 86
1 1004 DAL 102
1 1003 POR 100
2 1015 LAL 96
2 1029 MIL 85
df2
GameID Team1ID Team2ID Team1Abb Team2Abb Team1PTS Team2PTS
0 1001 1023 TOR ATL 99 86
0 1023 1001 ATL TOR 86 99
1 1004 1003 DAL POR 102 100
1 1003 1004 POR DAL 100 102
从本质上讲,这是一种数据框架的扩展。
尝试:
df2 = df1.set_index(['GameID', df1.groupby('GameID').cumcount()+1]).unstack()
df2.columns=[f'{i}_{j}' for i, j in df2.columns]
df2.reset_index()
输出:
GameID TeamID_1 TeamID_2 TeamAbb_1 TeamAbb_2 PTS_1 PTS_2
0 0 1001 1023 TOR ATL 99 86
1 1 1004 1003 DAL POR 102 100
2 2 1015 1029 LAL MIL 96 85
详情:
- 使用'GameID'到
groupby
和cumcount
得到1和2。
- 然后,使用 list 展平由 groupby 创建的多索引列 headers
理解力
- 最后,
reset_index
根据以下评论更新:
#Create home team and visiting team records
g = df.groupby('GameID').cumcount()
dfh = df.set_index(['GameID', g + 1])
dfv = df.set_index(['GameID', 2 - g])
dfh = dfh.unstack()
dfh.columns = [f'{i}_{j}' for i, j in dfh.columns]
dfv = dfv.unstack()
dfv.columns = [f'{i}_{j}' for i, j in dfv.columns]
# concatenate home and visiting records
pd.concat([dfh, dfv]).sort_index().reset_index()
输出:
GameID TeamID_1 TeamID_2 TeamAbb_1 TeamAbb_2 PTS_1 PTS_2
0 0 1001 1023 TOR ATL 99 86
1 0 1023 1001 ATL TOR 86 99
2 1 1004 1003 DAL POR 102 100
3 1 1003 1004 POR DAL 100 102
4 2 1015 1029 LAL MIL 96 85
5 2 1029 1015 MIL LAL 85 96
我有一个 NBA 数据的数据框,我很难处理它。我想将 df1 更改为 df2,方法是让两支球队及其得分在同一行中两次,以类似于从两支球队的角度来看的比赛结果:
df1
GameID TeamID TeamAbb PTS
0 1001 TOR 99
0 1023 ATL 86
1 1004 DAL 102
1 1003 POR 100
2 1015 LAL 96
2 1029 MIL 85
df2
GameID Team1ID Team2ID Team1Abb Team2Abb Team1PTS Team2PTS
0 1001 1023 TOR ATL 99 86
0 1023 1001 ATL TOR 86 99
1 1004 1003 DAL POR 102 100
1 1003 1004 POR DAL 100 102
从本质上讲,这是一种数据框架的扩展。
尝试:
df2 = df1.set_index(['GameID', df1.groupby('GameID').cumcount()+1]).unstack()
df2.columns=[f'{i}_{j}' for i, j in df2.columns]
df2.reset_index()
输出:
GameID TeamID_1 TeamID_2 TeamAbb_1 TeamAbb_2 PTS_1 PTS_2
0 0 1001 1023 TOR ATL 99 86
1 1 1004 1003 DAL POR 102 100
2 2 1015 1029 LAL MIL 96 85
详情:
- 使用'GameID'到
groupby
和cumcount
得到1和2。 - 然后,使用 list 展平由 groupby 创建的多索引列 headers 理解力
- 最后,
reset_index
根据以下评论更新:
#Create home team and visiting team records
g = df.groupby('GameID').cumcount()
dfh = df.set_index(['GameID', g + 1])
dfv = df.set_index(['GameID', 2 - g])
dfh = dfh.unstack()
dfh.columns = [f'{i}_{j}' for i, j in dfh.columns]
dfv = dfv.unstack()
dfv.columns = [f'{i}_{j}' for i, j in dfv.columns]
# concatenate home and visiting records
pd.concat([dfh, dfv]).sort_index().reset_index()
输出:
GameID TeamID_1 TeamID_2 TeamAbb_1 TeamAbb_2 PTS_1 PTS_2
0 0 1001 1023 TOR ATL 99 86
1 0 1023 1001 ATL TOR 86 99
2 1 1004 1003 DAL POR 102 100
3 1 1003 1004 POR DAL 100 102
4 2 1015 1029 LAL MIL 96 85
5 2 1029 1015 MIL LAL 85 96