Как связать дочерние элементы с родительским элементом в pandas dataframe?

#python #numpy #dataframe

#python #numpy #фрейм данных

Вопрос:

Я застрял с небольшой проблемой с python и pandas dataframe. Как я могу перебирать столбец и использовать данные типа, чтобы связать дочерние элементы (апельсин, банан и авокадо) с родительским «Фруктом», а дочерние элементы (бургер, картофель фри) с родительским ‘Фаст-фудом’?

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

Ответ №1:

Вы могли бы начать с проверки, где 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
 

Ответ №2:

Вы можете создать ряд с предварительно заполненными значениями 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