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))