[英]Long to wide format using a dictionary
我想對我的 dataframe 進行長期到廣泛的轉換,從
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 執行此操作的最佳方法嗎? 如果是這樣,我如何構建這個字典並從我原來的 pandas dataframe 中填充它?
看起來您想要 pivot dataframe。 問題是您的 dataframe 中沒有為您“枚舉”玩家的列。 如果您通過assign()
方法分配這樣的列,則pivot()
變得容易。
到目前為止,這里的情況實際上看起來非常相似。 唯一的區別是您似乎需要以特定方式格式化列名,其中字符串"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()
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.