#python #python-3.x #pandas #dataframe #python-2.7
Вопрос:
У меня есть такой фрейм данных:
title price weight
0 Crloni Model145 $45,$50,$60 200gm,500gm,800gm
здесь 45 долларов за 200 граммов, 50 долларов за 500 граммов и 60 долларов за 800 граммов. Мой ожидаемый фрейм данных будет выглядеть следующим образом:
title price weight
0 Crloni Model145 $45 200gm
1 Crloni Model145 $50 500gm
2 Crloni Model145 $60 800gm
Но теперь я получаю такой кадр данных
title price weight
0 Crloni Model145 $45 200gm
1 Crloni Model145 $45 500gm
2 Crloni Model145 $45 800gm
3 Crloni Model145 $50 200gm
4 Crloni Model145 $50 500gm
5 Crloni Model145 $50 800gm
6 Crloni Model145 $45 200gm
7 Crloni Model145 $45 500gm
8 Crloni Model145 $45 800gm
9 Crloni Model145 $60 200gm
10 Crloni Model145 $60 500gm
11 Crloni Model145 $60 800gm
вот мой код:
data['price']=data['price'].str.split(',')
data = data.explode('price')
data['weight']=data['weight'].str.split(',')
data = data.explode('weight')
обновленный вопрос:
Я применил Биллу раствор «Ящерица«. Я не получаю никаких ошибок, но я не вижу никакой цены, веса в моем csv-файле при экспорте csv-файла.
data['price']=data['price'].str.split(',')
data['weight']=df['weight'].str.split(',')
data = data.set_index(['title']).apply(pd.Series.explode).reset_index()
data.to_csv('...mypath/data.csv')
вот ПРОСТОЕ решение, но я получаю cannot reindex from a duplicate axis
data['price'] = data['price'].str.split(',')
data['weight'] = data['weight'].str.split(',')
out = data.explode(['price','weight'])
data['description'] = data['description'].mask(data['description].shift() == data['description'])
#обновление2
Билл, решение с ящерицей сработало, но я не понимаю, почему решение БЕНИ не работает? почему я получаю cannot reindex from a duplicate axis
эту ошибку при применении решения BENY
обновите 3 несколько строк моего исходного файла excel
category title price weight description
Shirt men-shirt 20,25,35 100gm,50gm,150gm shirt description....
pant men-pent 40,35,90 200gm,350gm,150gm pant description....
Комментарии:
1. Считаете ли вы
.explode
это недостаточным или ваши ожидания неверны? Можете ли вы сделать фрейм данных по — другому-у вас есть контроль над этим?2. @wwii Я начинаю изучать панд и питона. Я искал решение в Google и stack overflow, но не нашел никакого решения. Я понятия не имею, как решить эту проблему, поэтому здесь я опубликовал свою проблему. И все же сейчас я пытаюсь найти решение
3. Если вы создаете фрейм данных, это может быть проще исправить на этом этапе. Вы должны включить минимальный пример данных и кода, который вы используете для создания фрейма данных.
4. @wwii не могли бы вы, пожалуйста, показать мне пример?
5. Я думаю, что вы получите эту ошибку, когда попытаетесь разбить несколько столбцов, в списках которых не одинаковое количество значений. Можете ли вы добавить исходные значения для
price
weight
нескольких заголовков, показанных в вашем Excel, и для них?
Ответ №1:
Если у вас есть версия Pandas до версии 1.3.0, в которой был добавлен разброс по нескольким столбцам:
Поскольку списки после разделения строк содержат одинаковое количество элементов, вы можете применить Series.explode
столбцы price
и weight
к ожидаемому результату.
import pandas as pd
df = pd.DataFrame({'title': ['Crloni Model145'],
'price': ['$45,$50,$60'],
'weight': ['200gm,500gm,800gm']})
df['price']=df['price'].str.split(',')
df['weight']=df['weight'].str.split(',')
df = df.set_index(['title']).apply(pd.Series.explode).reset_index()
print(df)
Я установил индекс title
, потому что не хочу explode
, чтобы он применялся к этому столбцу, затем я сброшу индекс в конце, чтобы title
снова стать обычным столбцом.
Выход:
title price weight
0 Crloni Model145 $45 200gm
1 Crloni Model145 $50 500gm
2 Crloni Model145 $60 800gm
Комментарии:
1. при экспорте csv я не вижу никакой цены и веса. смотрите фото drive.google.com/file/d/1sbGDntZiG9SGVHtTkMCppApcRjnR4Zjt/…
2. @boyenec Пожалуйста, предоставьте достаточно данных в своем примере, чтобы мы могли воспроизвести эту ошибку.
3. конечно. Я обновляю свой запрос
4. Я обновил свой вопрос
5. как применить эту функцию
data['image-link'] = data['image-link'].mask(data['image-link'].shift() == data['image-link'])
, чтобы я мог предотвратить расширение строки изображения ?
Ответ №2:
Обновите свой pandas
и explode
теперь можете принимать две колонки
df['price'] = df['price'].str.split(',')
df['weight'] = df['weight'].str.split(',')
out = df.explode(['price','weight'])
Комментарии:
1. Это приводит к ошибке
ValueError: column must be a scalar
для меня.2. @colton обнови своих панд
3. хорошая идея, это гораздо более элегантное решение. Я был включен
1.2.4
и обновлен до1.3.3
.4. @ BENY getting
ValueError: column must be a scalar
и я обновили своих панд5. @boyenec обнови свою панду