Как взять 1 столбец значений и поместить некоторые из этих значений в новый столбец на основе столбца логического флага? - PullRequest
0 голосов
/ 04 ноября 2018

Скажите, у меня есть следующий двухмерный кадр данных

+--------+-------------------+------------+
| 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, но не смог заставить работать так, как мне хотелось. Обратите внимание, что в модулях нет заданного количества позиций и шаблонов в именах. Столбец «Является модулем» является единственным индикатором того, является ли значение модулем и его следует поворачивать. Все позиции, которые появляются под модулем до следующего модуля, должны принадлежать этому модулю при повороте.

На это не отвечает Как повернуть фрейм данных , потому что он никогда не объясняет, как разбить столбец на иерархию на основе значений, заданных в другом столбце.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Другое решение, использующее groupby

df.groupby(df['Is Module'].cumsum())['Module/Line Item']\
.apply(lambda g: pd.DataFrame({'Module':g.iloc[0],
                               'Line Item': g.iloc[1:].values}))\
.set_index('Module')

            Line Item
Module  
Module 1    Line Item 1
            Line Item 2
Module 2    Line Item 1
            Line Item 2
0 голосов
/ 04 ноября 2018

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...