一、需求
需将“宽数据”转换为“长数据”。
二、实践
1.构建测试集
import pandas as pd
import numpy as np
# 创建测试集
df = pd.DataFrame({
'Year':[2017, 2018, 2019, 2020, 2021],
'Name':['张飞', '吕布', '黄盖', '周瑜', '诸葛亮'],
'a': np.random.randn(5),
'b': np.random.randn(5),
'c': np.random.randn(5),
'd': np.random.randn(5)
})
df
'''
Year Name a b c d
0 2017 张飞 0.389854 1.309055 -0.306244 0.317678
1 2018 吕布 0.912390 -0.935596 -0.714069 1.051293
2 2019 黄盖 -1.171179 -0.616752 1.398038 -0.971296
3 2020 周瑜 -0.370362 -1.234490 1.256405 -0.476640
4 2021 诸葛亮 0.347184 1.759783 -1.017365 -0.061222
'''
2.方法一:stack & unstack
# 方法一:stack & unstack
df.set_index(['Year', 'Name'], inplace=True)
result = df.stack().reset_index()
result.rename(columns={'level_2': 'Col', 0: 'Value'}, inplace=True) # 重命名
3.方法二:melt
# 方法二:melt
result = pd.melt(df,
id_vars=['Year', 'Name'],
value_vars=['a', 'b', 'c', 'd'],
var_name='Col',
value_name='Value')
4.方法三:先拼接再explode爆炸函数裂开
# 方法三:先拼接再explode爆炸函数裂开
df['data'] = df.iloc[:, 2:6].apply(lambda x: '@'.join(x.astype(str)), axis=1)
df['data'] = df['data'].map(lambda x: x.split('@'))
df = df[['Year', 'Name', 'data']]
result = df.explode('data').reset_index(drop=True)
5.方法四:循环遍历
太 low 略
标签:Name,Python,random,笔记,行列,np,Year,df,data From: https://www.cnblogs.com/hider/p/16981035.html