2014-03-28 4 views
3

반복없이 DataFrame (팬더)의 조각을 형성 :스태킹 및 I는 다음과 같은 형태의 DataFrame이

 var1   var2  var3  day 
0 -0.001284819 0.00138089 1.022781 1 
1 -0.001310201 0.001377473 1.022626 1 
2 -0.001330947 0.001374873 1.022477 2 
3 -0.0013596  0.001430423 1.022385 2 
4 -0.001361913 0.00144389 1.02228  3 
5 -0.001371761 0.001440607 1.022161 3 
6 -0.001393955 0.00143729 1.022017 4 
7 -0.001431099 0.00143434 1.021908 4 
8 -0.001466792 0.00143334 1.021749 5 
9 -0.001491  0.00143159 1.021602 5 

VAR3에 각 변수 VAR1은 시계열이며, 두 개의 샘플을 매일 기록한다.

 day 1    2    3    4    5 
0 var1 -0.001284819 -0.001330947 -0.001361913 -0.001393955 -0.001466792 
1   -0.001310201 -0.0013596 -0.001371761 -0.001431099 -0.001491 
2 var2 0.00138089 0.001374873 0.00144389 0.00143729 0.00143334 
3   0.001377473 0.001430423 0.001440607 0.00143434 0.00143159 
4 var3 1.022781  1.022477  1.02228  1.022017  1.021749 
5   1.022626  1.022385  1.022161  1.021908  1.021602 

지금 각 열이 날, 매일 내에서 각 변수는 원래의 시계열에서와 같은 순서로 여전히 : 나는 이런 식으로이 DataFrame를 변환하는 것을 시도하고있다.

필자는 반복을 피하기 위해 피벗, 스태킹 및이 유형의 작업을 사용하여이 결과를 얻는 방법을 알아 내려고 노력했지만 지금까지는 관리 할 수 ​​없었습니다. 이 문제를 해결하는 방법에 대한

어떤 제안/힌트/아이디어는 매우

답변

2

그것은 반드시 예쁜 아니다 :) 감사하겠습니다 만, 과거에 나는

df = pd.read_csv("vd.csv", sep="\s+") 
d2 = pd.melt(df, id_vars="day") 
d2["sample"] = d2.groupby(["variable", "day"])["day"].rank("first") 
d3 = d2.pivot_table(index=["variable", "sample"], columns="day") 

같은 일을 한 적이있는 제공

>>> d3 
        value           
day      1   2   3   4   5 
variable sample             
var1  1  -0.001285 -0.001331 -0.001362 -0.001394 -0.001467 
     2  -0.001310 -0.001360 -0.001372 -0.001431 -0.001491 
var2  1  0.001381 0.001375 0.001444 0.001437 0.001433 
     2  0.001377 0.001430 0.001441 0.001434 0.001432 
var3  1  1.022781 1.022477 1.022280 1.022017 1.021749 
     2  1.022626 1.022385 1.022161 1.021908 1.021602 

[6 rows x 5 columns] 

(솔직히 말해서, 나는 앤디의 방법은 야바위꾼 생각하지만 용융 - 수정 - 피벗 패턴에 과거에 나를 위해 매우 유용하게 입증했기 때문에하지만. 이것을 떠날 거 야 여기 더 열심히 경우)

+0

보관 해 주셔서 감사합니다. TBH 나는 이것이 더 낫다고 생각한다. 어느 쪽이 더 읽기 좋을지 알고있다. (stack/unstack은 해독 할 수있다.) –

+0

나는 skippers가 실제로 "wide_to_long"이라고 생각한다. http://pandas-docs.github.io /pandas-docs-travis/reshaping.html#reshaping-by-melt, 예. 이것은 매우 가깝습니다 :''pd.wide_to_long (df, [ 'var1', 'var2', 'var3'], i = 'day', j = 'foo')'' 첫번째 장소 ..... – Jeff

+0

이것은 실제로 일했다. Andy의 버전은 매우 간결합니다. 제 의견으로는 좋지만 읽을 때 조금 더 어려워서 샘플을 순서대로 보관하지 않습니다. 고마워요! –

3

한 가지 방법은이 첫 번째 또는 두 번째의 경우 추적하기 위해 열을 만들 GROUPBY의 cumcount을 사용하는 것입니다.

In [13]: df.stack(0).unstack(0) 
Out[13]: 
day      1   2   3   4   5 
occurrence              
0   var1 -0.001285 -0.001331 -0.001362 -0.001394 -0.001467 
      var2 0.001381 0.001375 0.001444 0.001437 0.001433 
      var3 1.022781 1.022477 1.022280 1.022017 1.021749 
1   var1 -0.001310 -0.001360 -0.001372 -0.001431 -0.001491 
      var2 0.001377 0.001430 0.001441 0.001434 0.001432 
      var3 1.022626 1.022385 1.022161 1.021908 1.021602 
:

In [11]: df['occurrence'] = df.groupby('day').cumcount() 

In [12]: df = df.set_index(['day', 'occurrence']) 

지금 당신은 스택과 언 스택 약간의 작업을 수행 할 수 있습니다

+0

@ DSM 방식 (더 강력 함)을 선호합니다! stack/unstack 할 수있는 레벨은 읽기 쉽지 않습니다 ... –

관련 문제