我有以下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)
答案 0 :(得分:1)
解决方案是将参数values
添加到pivot
,然后为index
和reset_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
是您的类别列表,按顺序排列。
希望这有帮助。