2016-11-07 94 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