pandas 爆炸功能无法正常工作
pandas explode functionality not working properly
我有这样的数据框:
title price weight
0 Crloni Model145 ,, 200gm,500gm,800gm
这里 200 克 45 美元,500 克 50 美元,800 克 60 美元。我预期的数据框将如下所示:
title price weight
0 Crloni Model145 200gm
1 Crloni Model145 500gm
2 Crloni Model145 800gm
但现在我得到这样的数据框
title price weight
0 Crloni Model145 200gm
1 Crloni Model145 500gm
2 Crloni Model145 800gm
3 Crloni Model145 200gm
4 Crloni Model145 500gm
5 Crloni Model145 800gm
6 Crloni Model145 200gm
7 Crloni Model145 500gm
8 Crloni Model145 800gm
9 Crloni Model145 200gm
10 Crloni Model145 500gm
11 Crloni Model145 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....
更新您的 pandas
和 explode
现在可以接受两列
df['price'] = df['price'].str.split(',')
df['weight'] = df['weight'].str.split(',')
out = df.explode(['price','weight'])
如果您有 1.3.0 之前的 Pandas 版本,其中添加了多列 explode:
由于拆分字符串后的列表具有相同数量的元素,您可以将 Series.explode
应用于 price
和 weight
列以获得预期输出。
import pandas as pd
df = pd.DataFrame({'title': ['Crloni Model145'],
'price': [',,'],
'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 200gm
1 Crloni Model145 500gm
2 Crloni Model145 800gm
我有这样的数据框:
title price weight
0 Crloni Model145 ,, 200gm,500gm,800gm
这里 200 克 45 美元,500 克 50 美元,800 克 60 美元。我预期的数据框将如下所示:
title price weight
0 Crloni Model145 200gm
1 Crloni Model145 500gm
2 Crloni Model145 800gm
但现在我得到这样的数据框
title price weight
0 Crloni Model145 200gm
1 Crloni Model145 500gm
2 Crloni Model145 800gm
3 Crloni Model145 200gm
4 Crloni Model145 500gm
5 Crloni Model145 800gm
6 Crloni Model145 200gm
7 Crloni Model145 500gm
8 Crloni Model145 800gm
9 Crloni Model145 200gm
10 Crloni Model145 500gm
11 Crloni Model145 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....
更新您的 pandas
和 explode
现在可以接受两列
df['price'] = df['price'].str.split(',')
df['weight'] = df['weight'].str.split(',')
out = df.explode(['price','weight'])
如果您有 1.3.0 之前的 Pandas 版本,其中添加了多列 explode:
由于拆分字符串后的列表具有相同数量的元素,您可以将 Series.explode
应用于 price
和 weight
列以获得预期输出。
import pandas as pd
df = pd.DataFrame({'title': ['Crloni Model145'],
'price': [',,'],
'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 200gm
1 Crloni Model145 500gm
2 Crloni Model145 800gm