разбить и преобразовать соединенную строку из строк в столбцы

Вопрос или проблема

Я новичок в Python и испытываю трудности с преобразованием данных. У меня есть датафрейм с данными, как указано ниже.

UserId  PurchaseCnt
u1      Bread:6, Milk:11
u2      Water:3

Я хочу преобразовать это в датафрейм, как показано ниже. Как мне это сделать?

UserId Bread Milk Water
u1     6     11
u2     0     0    3

Мне нужно сделать это для большого объема данных. Поэтому нужен эффективный код. Какой код на Python мне подойдет для этого?

Код

import re
pat = r'(\w+):(\d+)'
s = df['PurchaseCnt'].map(lambda x: {i: int(j) for i, j in re.findall(pat, x)})
out = df[['UserId']].join(pd.json_normalize(s))

результат:

    UserId  Bread   Milk    Water
0   u1      6.0     11.0    NaN
1   u2      NaN     NaN     3.0

Пример кода

import pandas as pd
data = {
    'UserId': ['u1', 'u2'],
    'PurchaseCnt': ['Bread:6, Milk:11', 'Water:3']
}
df = pd.DataFrame(data)

Ответ или решение

Чтобы преобразовать конкатенированную строку в строки и столбцы в DataFrame в Python, вы можете использовать библиотеку pandas. Ваша задача состоит в том, чтобы взять столбец PurchaseCnt, который содержит данные в формате товар:количество, и превратить его в отдельные столбцы с именами товаров, где значения — это количество товара, купленного каждым пользователем. Ниже приведён пример кода, который решает вашу задачу, включая комментарии для лучшего понимания:

Шаги для решения:

  1. Импортируйте необходимые библиотеки: В данном случае нам понадобятся pandas и re.
  2. Создайте DataFrame: Это позволит вам иметь структуру данных для обработки.
  3. Используйте регулярные выражения для разбора строк: Мы будем использовать re.findall, чтобы извлечь пары товар:количество.
  4. Преобразуйте извлечённые данные в требуемый формат: Используем pd.json_normalize, чтобы создать новые столбцы из извлечённых данных.
  5. Объедините данные: Соедините новые столбцы с исходными данными.

Пример кода:

import pandas as pd
import re

# Шаг 1: Создание исходного DataFrame
data = {
    'UserId': ['u1', 'u2'],
    'PurchaseCnt': ['Bread:6, Milk:11', 'Water:3']
}
df = pd.DataFrame(data)

# Шаг 2: Определение паттерна для разбора данных
pattern = r'(\w+):(\d+)'

# Шаг 3: Использование регулярных выражений и словарей для преобразования данных
# Применяем функцию map для извлечения данных
extracted = df['PurchaseCnt'].map(lambda x: {item: int(count) for item, count in re.findall(pattern, x)})

# Шаг 4: Создание нового DataFrame из извлечённых данных
expanded_df = df[['UserId']].join(pd.json_normalize(extracted))

# Замените NaN на 0 для количества товаров
expanded_df = expanded_df.fillna(0)

# Шаг 5: Печать конечного DataFrame
print(expanded_df)

Ожидаемый вывод:

После выполнения вышеуказанного кода, вы получите следующий DataFrame:

  UserId  Bread  Milk  Water
0     u1      6    11    0.0
1     u2      0     0    3.0

Объяснение кода:

  • Импортирование библиотек: pandas используется для работы с таблицами данных, а re — для работы с регулярными выражениями.
  • Создание DataFrame: Инициализация df с данными о пользователях и их покупках.
  • Регулярные выражения: Паттерн (\w+):(\d+) позволяет извлекать название товара и его количество.
  • Преобразование DataFrame: Мы используем map, чтобы применить функцию к каждому элементу PurchaseCnt, результатом которой будет словарь, где ключи — товары, а значения — их количества. Эти словари потом превращаются в новый DataFrame с использованием pd.json_normalize.
  • Заполнение пропусков: Все отсутствующие значения (NaN) заменяются на 0, чтобы отразить отсутствие покупок соответствующих товаров.

Заключение:

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

Оцените материал
Добавить комментарий

Капча загружается...