如何在pandas中添加repitition index和unstack?

时间:2017-05-31 07:22:50

标签: pandas

数据框如下:

time         a   b   c   d   e
2006/1/16   249 249 250 250 251
2006/2/15   254 253 255 255 255
2006/3/16   261 261 262 262 264
2006/4/16   272 271 273 273 274
2006/5/16   282 281 283 283 283
2006/6/16   288 287 289 289 289
2006/7/16   292 292 293 293 293
2006/8/16   290 290 291 291 292
2006/9/16   282 281 283 283 284
2006/10/16  271 270 272 272 273
2006/11/16  259 258 260 260 261
2006/12/16  251 251 252 252 253
2007/1/16   247 247 247 248 250
2007/2/15   253 253 254 254 255
2007/3/16   261 261 262 262 264
2007/4/16   273 272 274 274 275
2007/5/16   282 281 283 283 283
2007/6/16   288 288 290 289 290
2007/7/16   292 292 293 293 294
2007/8/16   291 290 291 291 292
2007/9/16   282 282 283 283 284
2007/10/16  271 270 272 272 273
2007/11/16  260 259 261 261 262

我想以

取消堆叠
 a          1  2   3  4  5   6   7  8  9  10  11  12
     2006    .......................................
     2007    .......................................

 b   2006    .......................................
     2007    .......................................

             .......................................
 c   2006

 d   ...............................................

 e   2007    .......................................

pandas时间戳可以适用吗?如果没有year列,如何生成monthtime索引。

year   month
2006    1
2006    2
...     ..
2006    12
2007    1
2007    2
...    ...
2007    12      

2 个答案:

答案 0 :(得分:2)

首先使用to_datetime,然后使用MultiIndex.from_arrays创建year month并分配给索引。然后移除列timeunstack,最后转置T

df['time'] = pd.to_datetime(df['time'])
df.index = pd.MultiIndex.from_arrays([df['time'].dt.month,  df['time'].dt.year], 
                                      names=(None, None))
df = df.drop('time', axis=1).unstack(fill_value=0).T
print (df)
         1    2    3    4    5    6    7    8    9    10   11   12
a 2006  249  254  261  272  282  288  292  290  282  271  259  251
  2007  247  253  261  273  282  288  292  291  282  271  260    0
b 2006  249  253  261  271  281  287  292  290  281  270  258  251
  2007  247  253  261  272  281  288  292  290  282  270  259    0
c 2006  250  255  262  273  283  289  293  291  283  272  260  252
  2007  247  254  262  274  283  290  293  291  283  272  261    0
d 2006  250  255  262  273  283  289  293  291  283  272  260  252
  2007  248  254  262  274  283  289  293  291  283  272  261    0
e 2006  251  255  264  274  283  289  293  292  284  273  261  253
  2007  250  255  264  275  283  290  294  292  284  273  262    0

答案 1 :(得分:2)

我从<#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.IO" #> <#@ output extension=".cs" #> using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; <# if (File.Exists(Host.ResolvePath("git_version.txt"))) { Write("[assembly: AssemblyInformationalVersion(\""+ File.ReadAllText(Host.ResolvePath("git_version.txt")).Trim() + "\")]"); }else{ Write("// version file not found in " + Host.ResolvePath("git_version.txt")); } #> 数组构建一个新的pd.Seriesnumpy

unstack