Нормализуйте Pandas DataFrame как таблицы баз данных - PullRequest
1 голос
/ 10 апреля 2020

Я хотел бы разбить фрейм данных, который включает в себя 2 типа данных (владельцев брендов и продуктов), и на 2 фрейма данных.

Исходный фрейм данных:

>>> products
        product_id     brand_owner     product_name
0       344606         Cargill         A
1       344607         Red Gold        B
2       344608         FooBar          C
3       344609         Red Gold        D
4       344610         Cargill         E

Мне нравится Извлечь brand_owner в другой фрейм данных, очень похоже на нормализацию базы данных:

>>> brand_owners = pd.DataFrame(branded_foods['brand_owner'].unique())
>>> brand_owners
                        0
0                 Cargill
1      Kellogg Company Us
2                Kashi Us
3                Red Gold
4          Conagra Brands
...                   ...

Я дал его строкам идентификатор (опять же, как первичный ключ базы данных)

>>> brand_owners.index += 1
>>> brand_owners['id'] = brand_owners.index
>>> brand_owners
                        0     id
1                 Cargill      1
2      Kellogg Company Us      2
3                Kashi Us      3
4                Red Gold      4
5          Conagra Brands      5
...                   ...    ...

[25202 rows x 2 columns]
>>> brand_owners.columns = ['name', 'id']
>>> brand_owners
                     name     id
1                 Cargill      1
2      Kellogg Company Us      2
3                Kashi Us      3
4                Red Gold      4
5          Conagra Brands      5
...                   ...    ...

Теперь я хочу получить эти идентификаторы возвращаются в исходный фрейм данных, поэтому будет выглядеть так:

        product_id     brand_owner     product_name
0       344606         1               A
1       344607         4               B
2       344608         45              C
3       344609         4               D
4       344610         1               E

Как сделать это обновление в Pandas: обновить продукты p установить p.brand_owner = (выберите идентификатор от brand_owners b, где b.name = p.brand_owner)

1 Ответ

3 голосов
/ 10 апреля 2020

Вы можете напрямую кодировать категории в brand_owner с помощью pd.factorize:

df['brand_owner'] = pd.factorize(df.brand_owner)[0]

print(df)

   product_id  brand_owner product_name
0      344606            0            A
1      344607            1            B
2      344608            2            C
3      344609            1            D
4      344610            0            E
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...