2017-05-31 9 views
1

データフレームを次のように?私はパンダで反復インデックスとアンスタックを追加する方法は?

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

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

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

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

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

パンダはcoundがそれに適用することとNO time列が存在しない場合はどのようにyearmonthインデックスを生成するタイムスタンプとしてアンスタックしたい

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 

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

答えて

2

使用to_datetimeはまず、その後、yearmonthMultiIndex.from_arraysを作成し、インデックスに割り当てます。その後Tにより、カラムtimeunstack、最後の転置を削除します。

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 
2

私はそれはLILE `repeat`年間使用して補助列を追加し、`見える新しいpd.Seriesnumpyからの配列とunstack

df.time = pd.to_datetime(df.time) 

cols = list('abcde') 
n, m = len(df), len(cols) 

v = np.concatenate([df[c].values for c in cols]) 
i = np.repeat(cols, n) 
y = np.tile(df.time.dt.year.values, m) 
m = np.tile(df.time.dt.month.values, m) 

pd.Series(v, pd.MultiIndex.from_arrays([i, y, m])).unstack(fill_value=0) 

     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 
+0

を構築したいですタイルの月。 – Cobin

+0

@Cobinどういう意味ですか? – piRSquared

+0

スタックを解除するための新しい列を追加する方法は簡単です。 – Cobin

関連する問題