使用 pandas 转换为长面板数据格式
Converting to long panel data format with pandas
我有一个 DataFrame,其中行代表时间,列代表个人。我想以一种有效的方式将其转换为 pandas 中的长面板数据格式,因为 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
由于数据量大,速度对我来说非常重要。如果有权衡的话,我更喜欢它而不是优雅。虽然我怀疑我错过了一个相当简单的功能,但 pandas 应该能够处理它。有什么建议吗?
您要找的功能是
df.reset_index()
然后您可以使用
重命名您的列
df.columns = ['date', 'id', 'value']
我觉得你需要stack
with 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
使用melt
pd.melt(df.reset_index(),
id_vars='date',
value_vars=['1', '2'],
var_name='Id')
编辑:
因为 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))
我有一个 DataFrame,其中行代表时间,列代表个人。我想以一种有效的方式将其转换为 pandas 中的长面板数据格式,因为 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
由于数据量大,速度对我来说非常重要。如果有权衡的话,我更喜欢它而不是优雅。虽然我怀疑我错过了一个相当简单的功能,但 pandas 应该能够处理它。有什么建议吗?
您要找的功能是
df.reset_index()
然后您可以使用
重命名您的列df.columns = ['date', 'id', 'value']
我觉得你需要stack
with 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
使用melt
pd.melt(df.reset_index(),
id_vars='date',
value_vars=['1', '2'],
var_name='Id')
编辑:
因为 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))