如何根据列表中的后续字符串将字符串列表转换为两列数据帧

2024-09-29 01:21:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经能够从网站上抓取数据,但由于电子商务项目中缺少一些值,数据不一致,我使用beautifulsoup获取数据, 下面是一个示例数据集,其中评级紧跟在产品名称之后,有些没有,后面紧跟着另一个产品名称,因此在这方面,我想将它们设置为“无评级”。 这是我第一次成为python的新手 提前谢谢

data = ['Samsung Galaxy A12 ',
 '5 out of 5(6)',
 'Screenguard',
 'Samsung Galaxy Mos / A02s ',
 '4 out of 5(1)'
  'Pillow']

实际上,我想将其转换为一个基于后续评级(5(6)中的5)的数据框架,在某些项目下,有些项目有评级,而有些项目没有评级,这就是为什么它们在数据中不一致的原因

下面是预期的数据帧

   product                          ratings
   Samsung Galaxy A12               5 out of 5(6)
   Screenguard                      No rating
   Samsung Mos / A02s               4 out of 5(1)
   Pillow                           No rating

Tags: of数据项目no网站outgalaxyrating
2条回答

这适用于发布的数据,但我建议您调整用于刮取的代码,以便在找不到评级时返回“无评级”

import pandas as pd

data = [
    "Samsung Galaxy A12 ",
    "5 out of 5(6)",
    "Screenguard",
    "Samsung Galaxy Mos / A02s ",
    "4 out of 5(1)",
    "Pillow",
]

products = [product for product in data if not "out of" in (product)]

ratings = []

idx = 1

for product in products:
    idx = data.index(product)

    if idx>=len(data)-1:
        ratings.append('No rating')
    elif  not 'out of' in data[idx+1]:
        ratings.append('No rating')
    else:
        ratings.append(data[idx+1])

df = pd.DataFrame({'product':products, 'rating': ratings})
Sample Output

                      product         rating
0         Samsung Galaxy A12   5 out of 5(6)
1                 Screenguard      No rating
2  Samsung Galaxy Mos / A02s   4 out of 5(1)
3                      Pillow      No rating

正如在评论中提到的,我认为在清理时处理这个问题更好/更干净

这是一个我认为可以解决你问题的代码


#Init data
import pandas as pd

data = ['Samsung Galaxy A12 ',
 '5 out of 5(6)',
 'Screenguard',
 'Samsung Galaxy Mos / A02s ',
 '4 out of 5(1)'
  'Pillow']

# Create function
def clean_data_to_df(data):
    phones, ratings = [], []
    for idx, value in enumerate(data):
        # 1st phone
        if idx == 0:
            phones.append(value)
            continue
        # Add rating
        if 'out of' in value:
            ratings.append(value)
            continue

        # If not a rating, it is a phone.
        phones.append(value)

        if 'out of' not in data[idx-1]:
            ratings.append('No Rating')

    if len(phones)>len(ratings):
        ratings.append('No Rating')
    return pd.DataFrame({'phone':phones, 'ratings':ratings})

clean_data_to_df(data)

输出



        phone                   ratings
0   Samsung Galaxy A12          5 out of 5(6)
1   Screenguard                 No Rating
2   Samsung Galaxy Mos / A02s   4 out of 5(1)
3   Pillow                      No Rating

相关问题 更多 >