使用pandas

时间:2016-11-07 14:36:31

标签: python python-3.x pandas dataframe panel-data

我有一个DataFrame,其中行代表时间,列代表个人。我希望以高效的方式将其转换为大熊猫中的长面板数据格式,因为DataFames相当大。我想避免循环。下面是一个示例:以下DataFrame:

      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 个答案:

答案 0 :(得分:3)

我认为stack需要reset_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

答案 1 :(得分: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))

答案 2 :(得分:1)

您正在寻找的功能是

df.reset_index()

然后,您可以使用

重命名列
df.columns = ['date', 'id', 'value']