Python 使用pandas转换为长面板数据格式

Python 使用pandas转换为长面板数据格式,python,python-3.x,pandas,dataframe,panel-data,Python,Python 3.x,Pandas,Dataframe,Panel Data,我有一个数据框,其中行表示时间,列表示个人。我想以一种高效的方式将其转换为长面板数据格式,因为数据量相当大。我希望避免循环。以下是一个示例:以下数据帧: 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

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

      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

由于数据的大小,速度对我来说非常重要。如果有折衷的话,我更喜欢它而不是优雅。尽管我怀疑我遗漏了一个相当简单的函数,熊猫应该能够处理这个问题。有什么建议吗?

您正在寻找的功能是

df.reset_index()
然后可以使用重命名列

df.columns = ['date', 'id', 'value']
我认为你需要:



使用
melt

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


编辑:
因为OP想要快;-)


那不行。显然,我还需要上面提到的堆栈函数。谢谢你。Thanks@piRSquared,这确实有效,但公认的解决方案速度快了1.25倍。@jezrael的答案是我推荐的。有时我会发布一个替代方案,因为它可能对其他人仍然有用。。。甚至是你。我发现其他海报的解决方案非常宝贵。pandas/numpy通常有很多解决方案,其中一些在某些情况下速度更快,而另一些情况下速度较慢。这非常有意义,非常感谢我将保留此备选方案mind@splinter我已经用更快的解决方案更新了帖子。请记住,如果你在问题中指出速度/效率是你的目标,你几乎总是会得到不同的回答。这是正确的,而且比其他建议的答案更快
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
pd.melt(df.reset_index(),
        id_vars='date',
        value_vars=['1', '2'],
        var_name='Id')
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))