python - Pandas 爆炸功能无法正常工作

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

我有这样的数据框:

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

看图: enter image description here

这里是 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....   

最佳答案

如果您有 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

关于python - Pandas 爆炸功能无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69378904/

相关文章:

python - Python中的静态类变量和方法

python - 如何在一行中打印二维数组的行?

c# - 如何使用与 C# 兼容的 python 创建 RSA 加密 key 对,反之亦然?

python - Collat​​z 环结构

python - 裁剪多边形并将其转换为灰度

python - 计算数据框列中字符串的最大连续出现次数

python - 如何在 'int' 函数中将数字四舍五入到十分之一?

python - .drop() 的 Pandas bool 索引错误

python - 如何通过迭代替换数据框列的某些值

python - 从另一个写入 KML 文件