通过删除一些标题并重命名某些索引来旋转pandas

时间:2018-03-21 11:37:02

标签: python pandas pivot

我有以下pandas数据帧:

    count  event      date
0    1544  'strike'   2016-11-01
1     226  'defense'  2016-11-01
2    1524  'strike'   2016-12-01
3     246  'defense'  2016-12-01
4    1592  'strike'   2017-01-01
5     245  'defense'  2017-01-01

我想以这样的方式对它进行透视/转换,最终输出如下所示:

event     2016-11-01 2016-12-01 2017-01-01 2017-02-01 2017-03-01                                                                     
'strike'        1544       1524       1592       1608       1654   
'defense'        226        246        245        210        254

但我现在在转动时得到的是:

                        count          count            count           count             count\
date          2016-11-01 2016-12-01 2017-01-01 2017-02-01 2017-03-01   
event                                                                  
'strike'            1544       1524       1592       1608       1654   
'defense'            226        246        245        210        254   

有什么方法可以删除event索引名称前面的整个空行,并将date索引名称重命名为event作为其索引名称,同时删除数据框第一行中出现不需要的count?数据似乎正在正确转换我只是想摆脱这些标头和索引,并正确地重命名和删除。我也不希望行标签出现在所需的输出中。

这是我一直在尝试的事情:

output = df.pivot(index='event', columns='date')
print(output)

2 个答案:

答案 0 :(得分:1)

解决方案是将参数values添加到pivot,然后为indexreset_index的列添加rename_axis以删除列名称:

output=df.pivot(index='event',columns='date',values='count').reset_index().rename_axis(None,1)
print(output)
       event  2016-11-01  2016-12-01  2017-01-01
0  'defense'         226         246         245
1   'strike'        1544        1524        1592

如果省略它会怎么样?

print (df)
   count      event        date  count1
0   1544   'strike'  2016-11-01       1
1    226  'defense'  2016-11-01       7
2   1524   'strike'  2016-12-01       8
3    246  'defense'  2016-12-01       3
4   1592   'strike'  2017-01-01       0
5    245  'defense'  2017-01-01       1

pivot使用每个未使用的列并创建MultiIndex来区分原始列:

output = df.pivot(index='event', columns='date')
print(output)
               count                           count1                      
date      2016-11-01 2016-12-01 2017-01-01 2016-11-01 2016-12-01 2017-01-01
event                                                                      
'defense'        226        246        245          7          3          1
'strike'        1544       1524       1592          1          8          0

答案 1 :(得分:1)

我建议使用pd.pivot()的更一般版本,即pd.pivot_table(),如下所示:

x = pd.pivot_table(df, index = 'event', columns = 'date', values = 'count')

你会得到:

date    01/01/2017  01/11/2016  01/12/2016
event           
'defense'   245         226        246
'strike'    1592        1544       1524

接下来,你可以摆脱日期'字符串设置:

x.columns.name = ' ' 

此外,如果您想更改事件的顺序,您可能希望在进行透视之前将变量设置为分类变量:

df.event = df.event.astype('category') # cast to categorical
df.event.cat.set_categories(your_list, inplace = True) # force order

其中your_list是您的类别列表,按顺序排列。

希望这有帮助。