python - 从数据框创建面板数据
问题描述
我在这里找不到我的问题的解决方案,希望你能解决它。这是我当前的数据框:
| Index | Col_1_data | Col_2_data | Col_3_data | Col_1_new_data | Col_2_new_data | Col_3_new_data |
| 1 | a | d | g | j | m | p |
| 2 | b | e | h | k | n | q |
| 3 | c | f | i | l | o | r |
我们的想法是将它融化,使其看起来像这样:
| Index | data | new_data | id_col |
| 1 | a | j | Col_1 |
| 2 | b | k | Col_1 |
| 3 | c | l | Col_1 |
| 1 | d | m | Col_2 |
| 2 | e | n | Col_2 |
| 3 | f | o | Col_2 |
....etc....
所以让它成为一个面板,但没有任何 ID 列,而是每列都相同的部分字符串(例如 Col_1、Col_2 等)。有没有办法“pythonically”或者我需要循环和堆叠?
解决方案
这是一种方法,但也许有一种更有效的方法。
您可以做的是根据列是否为“新”,将数据集分成两部分,然后使用pd.melt
with pd.concat
。
# Create an index column (if not exists already)
df['index']=np.arange(len(df))+1
# melt both datasets and concat together
out = pd.concat([pd.melt(pd.concat([df.filter(like='new'),df[['index']]],axis=1),
id_vars='index',var_name=['id_col']).rename({'value':'data'},
axis=1).drop(['id_col'],axis=1),
pd.melt(df[[i for i in df.columns if 'new' in i or 'index' in i]],
id_vars='index',var_name=['id_col']).rename({'value':'new_data'},
axis=1)],
axis=1)
# Remove the '_new_data' from the 'id_col'
out['id_col'] = out['id_col'].str.replace('_new_data','')
# Rearrange the columns to match your output
out = out[['index','data','new_data','id_col']]
印刷:
index data new_data id_col
0 1 a j Col_1
1 2 b k Col_1
2 3 c l Col_1
3 1 d m Col_2
4 2 e n Col_2
5 3 f o Col_2
6 1 g p Col_3
7 2 h q Col_3
8 3 i r Col_3
最后两个步骤只需要精确地达到您想要的结果。
推荐阅读
- postgresql - 如何转换 PostgreSQL 中函数返回的数据
- javascript - 从 2 个下拉框中获取输入并根据两个答案转到新页面
- eloquent - 为什么选择不能在 Laravel 5.7 中以 eloquent 工作?
- excel - Excel 分组和后续排名保持分组
- python - 使用 Python 和 Selenium 发送 Instagram 评论
- javascript - 打印按钮无法在 javascript 上打印页面内容
- matlab - 'AliasType' 会是引用属于 Stateflow 内部结构的信号的解决方案吗?
- hyperledger-fabric - 超级账本有哪些对等类型?
- linux - 设置 agora.io 录制服务器时出现错误:20,stat_code:3
- azure - 如何获取应用服务环境的指标(通过 Azure Monitor)?