2016-11-07 97 views
3

我有一個DataFrame,其中行代表時間和列代表個人。我想以高效的方式將它變成熊貓的長面板數據格式,因爲DataFames相當大。我想避免循環。這裏有一個例子:下面的數據幀:用熊貓轉換爲長面板數據格式

 id 1 2 
date    
20150520 3.0 4.0 
20150521 5.0 6.0 

應該轉變成:

date  id  value 
20150520 1   3.0 
20150520 2   4.0 
20150520 1   5.0 
20150520 2   6.0 

速度是什麼對我真的很重要,因爲數據大小。如果存在折衷,我更喜歡它優雅。雖然我懷疑我媽媽錯過了一個相當簡單的功能,熊貓應該能夠處理它。有什麼建議麼?

回答

3

重命名列我認爲你需要stackreset_index

print (df) 
      1 2 
date    
20150520 3.0 4.0 
20150521 5.0 6.0 

df = df.stack().reset_index() 
df.columns = ['date','id','value'] 
print (df) 
     date id value 
0 20150520 1 3.0 
1 20150520 2 4.0 
2 20150521 1 5.0 
3 20150521 2 6.0 

print (df) 
id   1 2 
date    
20150520 3.0 4.0 
20150521 5.0 6.0 

df = df.stack().reset_index(name='value') 
print (df) 
     date id value 
0 20150520 1 3.0 
1 20150520 2 4.0 
2 20150521 1 5.0 
3 20150521 2 6.0 
+0

這是正確的,比其他建議soution快 – splinter

1

您正在尋找的功能是

df.reset_index() 

那麼你可以使用

df.columns = ['date', 'id', 'value'] 
+0

這是行不通的。顯然,我也需要上面提到的堆棧函數。謝謝您的好意。 – splinter

2

使用melt

pd.melt(df.reset_index(), 
     id_vars='date', 
     value_vars=['1', '2'], 
     var_name='Id') 

enter image description here


編輯:
由於OP要快;-)

def pir(df): 
    dv = df.values 
    iv = df.index.values 
    cv = df.columns.values 
    rc, cc = df.shape 
    return pd.DataFrame(
     dict(value=dv.flatten(), 
      id=np.tile(cv, rc)), 
     np.repeat(iv, cc)) 
+0

謝謝@ piRSquared,這確實有效,但接受的解決方案速度提高了1.25倍。 – splinter

+0

@ jezrael的答案是我推薦的。有時我會發佈一個替代解決方案,因爲它可能對其他人有用...甚至是你。我發現其他海報的解決方案是非常寶貴的。熊貓/ numpy通常有很多解決方案,其中一些在某些情況下速度較快,而另一些則較慢。 – piRSquared

+0

具有完美感,非常感謝我將保留此備選方案 – splinter