У меня есть фрейм данных записи продуктового магазина:
df = pd.DataFrame(np.array([['Tom', 'apple1'], ['Tom', 'banana35'], ['Jeff', 'pear0']]),
columns=['customer', 'product'])
| клиент | продукт | | -------- | --------| | Том| яблоко1| | Том| банан35| |Джефф| груша0| Я хочу получить все продукты, которые клиент когда-либо покупал, поэтому я использовал
product_by_customer = df.groupby('customer')['product'].unique()
product_by_customer
клиент | |
---|---|
Джефф | [груша0] |
Том | [яблоко1, банан35] |
Я хочу избавиться от цифр после названия продукта. Я попытался
product_by_customer.str.replace('[0-9]', '')
но он заменил все на NaN.
Мой желаемый результат |клиент|| |--------|--------| |Джефф|груша| |Том|яблоко, банан|
Любая помощь приветствуется!
Значения в столбце продукта имеют тип nd массив. Значит замены не будет. Попробуйте следующий код.
import re
df = pd.DataFrame(np.array([['Tom', 'apple1'], ['Tom', 'banana35'], ['Jeff', 'pear0']]),
columns=['customer', 'product'])
df1 = df.groupby(["customer"])["product"].unique().reset_index()
df1["product"] = df1["product"].apply(lambda x: [re.sub("\d","", v ) for v in x])
df1
Out[52]:
customer product
0 Jeff [pear]
1 Tom [apple, banana]
Что мы делаем, так это используем лямбда-функцию, мы получаем доступ к каждому значению массива, а затем заменяем цифры.
df = pd.DataFrame(np.array([['Tom', 'apple1'], ['Tom', 'banana35'], ['Jeff', 'pear0']]),
columns=['customer', 'product'])
df1 = df.copy()
df1["product"] = df1["product"].str.replace('[0-9]', '')
product_by_customer = df1.groupby('customer')['product'].unique()
product_by_customer
из :
customer
Jeff [pear]
Tom [apple, banana]
Name: product, dtype: object
сделать копию df и как насчет изменения перед groupby?
Вы можете сначала заменить, а затем агрегировать:
product_by_customer = df["product"].str.replace('[0-9]', '')
.groupby(df['customer']).unique()
print(product_by_customer)
customer
Jeff [pear]
Tom [apple, banana]
Name: product, dtype: object
Или объедините с удалением числового:
import re
f = lambda x: [re.sub("[0-9]", "", v) for v in x.unique()]
product_by_customer = df.groupby('customer')['product'].agg(f)
print(product_by_customer)
customer
Jeff [pear]
Tom [apple, banana]
Name: product, dtype: object
Аналогичная идея — удалить возможные дубликаты с помощью трюка dict.fromkeys
:
f = lambda x: list(dict.fromkeys(x.str.replace('[0-9]', '', regex=True)))
product_by_customer = df.groupby('customer')['product'].agg(f)
print (product_by_customer)
customer
Jeff [pear]
Tom [apple, banana]
Name: product, dtype: object