Как создать многомерный фрейм данных из строк, которые уже существуют в 2-мерном фрейме данных? - PullRequest
0 голосов
/ 03 ноября 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 |
+----------+-------------+

Как лучше всего это сделать? Есть ли встроенный способ поворачиваться через панд? Я возился с каким-то обычным питоном, но он был очень неэффективным, и я не мог заставить его работать правильно.

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

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

Ответы [ 2 ]

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

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

Создать данные:

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
0 голосов
/ 03 ноября 2018

Вы можете попробовать это:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.html

С фреймом данных вы можете поворачивать таблицу.

...