функции взрыва панд не работают должным образом

#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 обнови свою панду