#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