簡體   English   中英

使用字典的長到寬格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM