Разделение переменных в кадре данных Pandas на новые строки с помощью ключа повтора - PullRequest
0 голосов
/ 27 апреля 2018

Я думаю, что мой код близок, но действительно облажался. В основном у меня есть ряды данных о продажах. Одна из переменных - это номер квитанции, а другая - строка, содержащая единицы и продукты в виде строки.

Я бы хотел новую строку для каждого уникального продукта, сохранив соответствующий номер чека для этой строки. Например, запись для квитанции A с продуктами L и Q должна стать двумя отдельными записями: квитанция A с L и квитанция A с Q. Поэтому я пытаюсь разбить строку на переменные, а также создать новую запись под тем же идентификатор квитанции.

В любом случае, но когда я закончу, я случайно продублировал некоторые записи. Любая помощь с а) заставить его генерировать правильный вывод и б) более красивый / простой код? (Мне также не нужна старая переменная Description).

Большое спасибо

import pandas as pd
import numpy as np
df = pd.DataFrame({"Date": ["9/26/17 2:33 PM", "9/26/17 2:23 PM", "9/26/17 2:22 PM"], "Receipt number": ["1-1002","1-1001","1-1000"], "Description": ["1 x Capacino, 2 x Americano","1 x Americano","1 x Latte"]})
df

df2 = df['Description'].str.split(',').apply(pd.Series, 1).stack()
df2.index = df2.index.droplevel(-1)
df2.name = 'Product' 
df = df.join(df2)
df.join(df['Product'].str.split(' x ', 1, expand=True).rename(columns={0:'Units',   1:'Product Name'}))

1 Ответ

0 голосов
/ 27 апреля 2018

Ну, вы близко. За исключением последней строки. Вот что я сделал, следуя вашему коду:

import pandas as pd
import numpy as np
df = pd.DataFrame({"Date": ["9/26/17 2:33 PM", "9/26/17 2:23 PM", "9/26/17 2:22 PM"], "Receipt number": ["1-1002","1-1001","1-1000"], "Description": ["1 x Capacino, 2 x Americano","1 x Americano","1 x Latte"]})

df2 = df['Description'].str.split(',').apply(pd.Series, 1).stack()
df2.index = df2.index.droplevel(-1)
df2.name = 'Product' 
df = df.join(df2)

# Here is where I diverge
df['Units'] = df['Product'].apply(lambda x: int(x.split(' x ')[0]))
df['Product'] = df['Product'].apply(lambda x: x.split(' x ')[-1])
df = df.drop('Description', axis=1)

Результат

              Date Receipt number    Product  Units
0  9/26/17 2:33 PM         1-1002   Capacino      1
0  9/26/17 2:33 PM         1-1002  Americano      2
1  9/26/17 2:23 PM         1-1001  Americano      1
2  9/26/17 2:22 PM         1-1000      Latte      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...