我想对我的数据进行长到宽的转换,从
match_id player goals home
1 John 1 home
1 Jim 3 home
...
2 John 0 away
2 Jim 2 away
...
结束时:
match_id player_1 player_2 player_1_goals player_2_goals player_1_home player_2_home ...
1 John Jim 1 3 home home
2 John Jim 0 2 away away
...
由于我将有带有新名称的列,所以我想,也许我应该为此构建一个字典,其中外键与id匹配,每个人都是这样的:
dict = {1: {
'player_1': 'John',
'player_1_goals':1,
'player_1_home': 'home'
'player_2': 'Jim',
'player_2_goals':3,
'player_2_home': 'home'
},
2: {
'player_1': 'John',
'player_1_goals':0,
'player_1_home': 'away',
'player_2': 'Jim',
'player_2_goals':2
'player_2_home': 'away'
},
}
然后:
pd.DataFrame.from_dict(dict).T
然而,在实际情况下,玩家的数量会有所不同,我无法硬编码。
这是使用diciotnaries进行此操作的最佳方法吗?如果是这样的话,我怎样才能建立这个数据库,并从我原来的熊猫数据填充它?
发布于 2022-09-21 14:49:55
看上去你想把数据轴转过来。问题是,在您的数据中没有列为您“枚举”球员。如果您通过assign()
方法分配这样的列,那么pivot()
就变得容易了。
到目前为止,它实际上看起来非常相似的this case here。唯一的区别是,您似乎需要以一种特定的方式格式化列名,在这种方式中,字符串"player"
需要加到每个列名的前面。下面的set_axis()
调用就是这样做的。
(df
.assign(
ind=df.groupby('match_id').cumcount().add(1).astype(str)
)
.pivot('match_id', 'ind', ['player', 'goals', 'home'])
.pipe(lambda x: x.set_axis([
'_'.join([c, i]) if c == 'player' else '_'.join(['player', i, c])
for (c, i) in x
], axis=1))
.reset_index()
)
https://stackoverflow.com/questions/73807537
复制相似问题