【问题标题】:pandas explode functionality not working properly熊猫爆炸功能无法正常工作
【发布时间】:2021-11-21 12:13:38
【问题描述】:

我有这样的数据框:

     title            price        weight
   0 Crloni Model145  $45,$50,$60  200gm,500gm,800gm

这里 200 克 45 美元,500 克 50 美元和 800 克 60 美元。我预期的数据框将如下所示:

    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')

更新问题:

我应用了 Bill the Lizard 解决方案。我没有收到任何错误,但在导出 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')

看图:

这是 BENY 解决方案,但我收到了 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'])

#update2

Bill the Lizard 解决方案有效,但我不明白为什么 BENY 解决方案无效?为什么我在应用 BENY 解决方案时收到cannot reindex from a duplicate axis 这个错误

更新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....   

【问题讨论】:

  • 您认为.explode 有缺陷还是您的期望有误?你能以不同的方式制作 DataFrame - 你能控制它吗?
  • @wwii 我开始学习 pandas 和 python。我在谷歌和堆栈溢出上搜索找到解决方案,但我没有找到任何解决方案。我不知道如何解决这个问题,所以在这里我发布了我的问题。现在我还在努力寻找解决方案
  • 如果正在制作DataFrame,那么在该步骤中fix可能会更容易。您应该包含一个最小的数据示例和用于制作 DataFrame 的代码。
  • @wwii 你能给我举个例子吗?
  • 我认为,当您尝试分解列表中值数量不同的多个列时,您会遇到该错误。您能否为 Excel 中显示的少数标题添加 priceweight 的原始值?

标签: python python-3.x pandas dataframe python-2.7


【解决方案1】:

如果您有 1.3.0 之前的 Pandas 版本,其中添加了多列 explode

由于拆分字符串后的列表具有相同数量的元素,您可以将Series.explode 应用到priceweight 列到预期的输出。

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

【讨论】:

  • 导出 csv 时,我没有看到任何价格和重量。见图片drive.google.com/file/d/1sbGDntZiG9SGVHtTkMCppApcRjnR4Zjt/…
  • @boyenec 请在您的示例中提供足够的数据,以便我们重现此错误。
  • 当然。我正在更新我的任务
  • 我更新了我的问题
  • 如何应用此功能data['image-link'] = data['image-link'].mask(data['image-link'].shift() == data['image-link']),这样我就可以防止扩大图像行?
【解决方案2】:

更新您的pandasexplode 现在可以接受两列

df['price'] = df['price'].str.split(',')
df['weight'] = df['weight'].str.split(',')
out = df.explode(['price','weight'])

【讨论】:

  • 这导致我的错误ValueError: column must be a scalar
  • @colton 更新你的熊猫
  • 好电话,这是一个更优雅的解决方案。我在1.2.4 上并升级到1.3.3
  • @BENY 得到ValueError: column must be a scalar 我升级了我的熊猫
  • @boyenec 更新你的熊猫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2016-08-11
  • 1970-01-01
  • 2022-01-18
  • 2019-01-15
  • 2019-12-20
相关资源
最近更新 更多