熊猫 - 将不平衡的面板数据转换为横截面

时间:2015-06-10 14:53:29

标签: python pandas dataframe

实际上我不确定这是否是横截面的结尾,因为它是一段时间,但我认为它仍然是。

我有一个如下所示的数据框:

Player          Finish  Tournament  Year    id
------------------------------------------------
Aaron Baddeley  9       Memorial    2012    1
Aaron Baddeley  17      Masters     2013    1
Aaron Watkins   15      US Open     2012    2
Adam Scott      9       US Open     2014    3
Adam Scott      4       Memorial    2014    3
Alex Cejka      8       US Open     2010    4
Andres Romero   2       Memorial    2012    5
Andrew Svoboda  19      Memorial    2014    6
Andy Sullivan   13      Memorial    2015    7

我想将此数据转换为单个观察结果,所需的输出如下:

Player           2012_Memorial    2013_Memorial    2014_Memorial   ...  id
----------------------------------------------------------------------------
Aaron Baddeley        9                 17              2012             1
Adam Scott            NA                NA               9               3 
.
. 
.

我找到了split-apply-combine范例,看起来很有希望。但即使表面上,我已经完成df.groupby('id')并且打印语句输出:

               Player  Finish Tournament  Year 
id                                                                        
1      Aaron Baddeley       9   Memorial  2012 
2       Aaron Watkins      15    US Open  2012 
3          Adam Scott       9    US Open  2014 

所以它似乎已经崩溃了,但我现在丢失了数据?或者现在如何存储对象?我意识到我还没有完成应用阶段,这可能是我将如何生成新行和新列,但我不知道下一步或者是否有类似这样的菜谱示例。

谢谢,Jared

1 个答案:

答案 0 :(得分:1)

您似乎正在寻找一种方法来执行pivot_table操作。

从表格的近似开始:

df = pd.DataFrame({
    'player': ['ab', 'ab', 'aw', 'as', 'as'],
    'finish': [9, 17, 15, 9, 4],
    'tournament': ['m', 'm', 'us', 'us', 'm'],
    'year': [12, 13, 12, 12, 14],
    'id': [1, 1, 2, 3, 3]})

,并提供:

>> df
        finish  id  player  tournament  year
0   9   1   ab  m   12
1   17  1   ab  m   13
2   15  2   aw  us  12
3   9   3   as  us  12
4   4   3   as  m   14

你可以运行

>> df.pivot_table(values='finish', index=['player', 'id'], columns=['year', 'tournament'])
    year    12  13  14
    tournament  m   us  m   m
player  id              
ab  1   9   NaN     17  NaN
as  3   NaN     9   NaN     4
aw  2   NaN     15  NaN     NaN

请注意,它会为您提供多年级/锦标赛的多级列。我个人认为这更清洁,但您可以轻松flatten it