Как связать дочерние элементы с родительским элементом в кадре данных панд? - PullRequest
2 голосов
/ 15 апреля 2019

У меня возникла небольшая проблема с питоном данных Python и панд. Как я могу перебрать столбец и использовать данные «Тип», чтобы связать детей (апельсин, банан и авокады) с родительским «фруктом», а детей (бургер, картофель фри) с родительским «фаст-фудом»?

+-----------+------+----------+-----------+
| Parent_ID | ID   | Type     | Name      |
+-----------+------+----------+-----------+
|           | 226  | Category | Fruit     |
|           | 2090 | Item     | Orange    |
|           | 2091 | Item     | Banana    |
|           | 2092 | Item     | Avocados  |
|           | 209  | Category | Fast-Food |
|           | 2097 | Item     | Burger    |
|           | 2099 | Item     | fries     |
+-----------+------+----------+-----------+

Мне нужен мой фрейм данных, как показано ниже.

+-----------+------+----------+-----------+
| Parent_ID |  ID  |   Type   |   Name    |
+-----------+------+----------+-----------+
|           |  226 | Category | Fruit     |
|       226 | 2090 | Item     | Orange    |
|       226 | 2091 | Item     | Banana    |
|       226 | 2092 | Item     | Avocados  |
|           |  209 | Category | Fast-Food |
|       209 | 2097 | Item     | Burger    |
|       209 | 2099 | Item     | fries     |
+-----------+------+----------+-----------+

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Вы можете создать серию со значениями, заполненными вперед ID, а затем присвоить эти значения столбцу Parent_ID, когда Type == 'Item'

new_parent = df.query('Type=="Category"').reindex(df.index).ID.ffill().astype(int)

df.loc[df.Type.eq('Item'), 'Parent_ID'] = new_parent[df.Type.eq('Item')]

df
# returns:
  Parent_ID    ID      Type       Name
0             226  Category      Fruit
1       226  2090      Item     Orange
2       226  2091      Item     Banana
3       226  2092      Item   Avocados
4             209  Category  Fast-Food
5       209  2097      Item     Burger
6       209  2099      Item      fries
0 голосов
/ 15 апреля 2019

Вы можете начать с проверки, где столбец Type равен Category, и взять cumsum логического ряда. Затем используйте результат для GroupBy ID и примите первое как Parent_ID для каждой группы:

g = df.Type.eq('Category').cumsum()
df = df.assign(Parent_ID=df.groupby(g).ID.transform('first'))
df['Parent_ID'] = df.Parent_ID.where(df.ID.ne(df.Parent_ID)).fillna('')

    ID      Type       Name    Parent_ID
0   226  Category      Fruit          
1  2090      Item     Orange       226
2  2091      Item     Banana       226
3  2092      Item   Avocados       226
4   209  Category  Fast-Food          
5  2097      Item     Burger       209
6  2099      Item      fries       209
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...