python - 如何获取 1 列值并将其中一些值放入基于 bool 标志列的新列中?

标签 python python-3.x pandas dataframe

假设我有以下二维数据框

+--------+-------------------+------------+
| 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/

相关文章:

python - Python 中 socket.getfqdn 的 IPv6 替代品是什么?

python - 如何从两个列表中查找匹配的部分项目

python - Pandas 申请改变数据类型

python - 一个 Hot Encoding 列中有多个标签

python pandas groupby排序和连接

python - intersection() 和 'object for object in set if object in other_set' 之间的速度差异

python - 使用 NDK 在 Android 上从 C++ 运行 Python

Python 打开文件语句正在从空文件中读取行

python - 使用 while 循环递增数组中的值,直到所有值 => 100

python-3.x - Django ORM 错误 - 无法将 NULL 插入主键