python - 如何从二维数据框中已存在的行中创建多维数据框?
问题描述
假设我有以下二维数据框
+--------+-------------------+------------+
| Index, | Module/Line Item, | Is Module, |
+--------+-------------------+------------+
| 0, | Module 1, | True, |
| 1, | Line Item 1, | False, |
| 2, | Line Item 2, | False, |
| 3, | Module 2, | True, |
| 4, | Line Item 1, | False, |
| 5, | Line Item 2, | False |
+--------+-------------------+------------+
我希望它变成这样:
+----------+-------------+
| Module | Line Item |
+----------+-------------+
| Module 1 | Line Item 1 |
| | Line Item 2 |
| Module 2 | Line Item 1 |
| | Line Item 2 |
+----------+-------------+
实现这一目标的最佳方法是什么?有没有一种内置的方式可以通过熊猫进行这样的旋转?我在搞乱一些常规的 python,但它的效率非常低,我无法让它正常工作。
请注意,模块之间没有固定数量的行项目,名称中也没有模式。“是模块”列是该值是否是模块并且应该被透视的唯一指标。在下一个模块之前出现在模块下方的所有行项目在透视时都应属于该模块。
How to pivot a dataframe没有回答这个问题,因为它从不解释如何根据另一列中给出的值将列拆分为层次结构。
解决方案
您的问题不是旋转,而是您在一列中有两列。可能有一种更程序化的方式来做到这一点,但这里有一个让它以正确的形状和顺序进行的尝试,然后您可以根据需要进行分组和旋转。
创建数据:
df=pd.DataFrame({'mod_lin':['m1','l1','l2','m2','l1','l2'],'is_mod':[True,False,False,True,False,False]})
mod_lin is_mod
0 m1 True
1 l1 False
2 l2 False
3 m2 True
4 l1 False
5 l2 False
为模块创建新列,向前填充,从原始列中删除模块,删除 True/False 列,重新排序列
df['mods']=np.where(df['is_mod']==True, df['mod_lin'],np.NaN)
df['mods']=df['mods'].fillna(method='ffill')
df=df[df['is_mod']==False]
df.drop('is_mod', axis=1, inplace=True)
df=df[df.columns[::-1]]
mods mod_lin
1 m1 l1
2 m1 l2
4 m2 l1
5 m2 l2
推荐阅读
- python - 如何在同一个标签中同时使用字符串和 StringVar?
- c++ - 序列化地图以获得额外的空元素
- javascript - 使用 Testcafe-Reporter-HTML 会阻止测试运行
- java - 无法获取 BottomNavigationView 的 id
- python - Python中的沙漏
- javascript - 错误 [prerender-spa-plugin] - 无法预渲染所有路由
- python - 在品脱中继承 Q_ - 为什么超级调用不带参数?
- django - 使用 django-storages 进行 S3 版本控制
- mysql - 使用 CASE 更新 VIRTUAL GENERATED 列
- listview - 将复选框添加到 TableView 列