首页 > 解决方案 > 如何从二维数据框中已存在的行中创建多维数据框?

问题描述

假设我有以下二维数据框

+--------+-------------------+------------+
| 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没有回答这个问题,因为它从不解释如何根据另一列中给出的值将列拆分为层次结构。

标签: pythonpython-3.xpandasdataframepivot

解决方案


您的问题不是旋转,而是您在一列中有两列。可能有一种更程序化的方式来做到这一点,但这里有一个让它以正确的形状和顺序进行的尝试,然后您可以根据需要进行分组和旋转。

创建数据:

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

推荐阅读