假设我有以下二维数据框
+--------+-------------------+------------+
| 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 |
+----------+-------------+
实现这一目标的最佳方法是什么?我尝试了pivot_table和groupby,但我都无法按照我想要的方式工作。 请注意,模块之间没有固定数量的行项目,并且名称中没有模式。 “Is Module”列是指示该值是否是模块以及是否应该进行透视的唯一指示符。旋转时,直到下一个模块为止出现在该模块下方的所有订单项都应属于该模块。
How to pivot a dataframe 没有回答这个问题因为它从未解释如何根据另一列中给出的值将一列拆分为层次结构。
最佳答案
使用where
通过前向填充将 False
值替换为 Is Module
,将列名称和最后一个过滤器重命名为 boolean indexing
使用 loc
作为过滤器还有列名称:
df['Module'] = df['Module/Line Item'].where(df['Is Module']).ffill()
df = df.rename(columns={'Module/Line Item':'Line Item'})
df = df.loc[~df['Is Module'], ['Module','Line Item']]
print (df)
Module Line Item
1 Module 1 Line Item 1
2 Module 1 Line Item 2
4 Module 2 Line Item 1
5 Module 2 Line Item 2
如果需要,还可以将 Module
的重复值替换为空值:
df['Module'] = df['Module'].mask(df['Module'].duplicated(), '')
print (df)
Module Line Item
1 Module 1 Line Item 1
2 Line Item 2
4 Module 2 Line Item 1
5 Line Item 2
关于python - 如何获取 1 列值并将其中一些值放入基于 bool 标志列的新列中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53144058/