Как добавить еще один столбец в уже существующий фрейм данных, выполняя простую задачу - PullRequest
0 голосов
/ 20 января 2020

У меня есть образец электронной таблицы, которая содержит название элемента, его цену и URL-адрес. Мне нужно создать фрейм данных, который добавляет еще один столбец с именем index - который сравнивает целочисленное значение, полученное из соответствующего URL-адреса в столбце URL-адреса, с ценой. в столбце цены и показывает, меньше или больше столбца цены

, например,

name     price     url
egg       2        www.xyz/1-ed  
ham       34       www.xyz/2-ed

URL содержит другую цену, например для яйца 4 и ветчины 32

поэтому вывод должен быть:

name      price     url            index
egg        2        www.xyz/1-ed    less/n   
ham        34       www.xyz/2-ed    more

очевидно, что реальный код содержит более 300 записей, поэтому я должен применить его к этому.

    from bs4 import BeautifulSoup
    import time
    from smtplib import SMTP
    import pandas as pd
    import numpy as np
    import requests
    import re


    data = pd.read_csv(r'C:\Users\sahay\Desktop\python\priceforeca1.csv')
    df=pd.DataFrame(data,columns=['rates','URL'])

    print(df)

Это просто небольшая часть всего кода. Я не могу пройти этот шаг.

Спасибо за помощь новичку!

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Здесь вы можете использовать apply() функцию pandas.

Вот что вам нужно сделать:

import pandas as pd
import re
# Function to check if url digit is greater, less or equal to the price
def checkForIndex(price,url):
    match=re.findall(r'(\d+)',url)
    if(int(match[0])>price):
        return 'more'
    elif(int(match[0])<price):
        return 'less'
    else:
        return 'equal'   
# Making sample data for dataframe.
d={'Price':[2,34,4,3,67],'url':['www.xyz/1-ed','www.xyz/2-ed','www.xyz/4-ed','www.xyz/5-ed','www.xyz/66-ed']}
# Making dataframe
dataFrame= pd.DataFrame(data=d)
# Making a new column based on conditions of ither columns.
dataFrame['index']=dataFrame.apply(lambda x: checkForIndex(x.Price, x.url), axis=1)
# Printing the dataframe.
print(dataFrame)

Вывод:

   Price            url  index
0      2   www.xyz/1-ed   less
1     34   www.xyz/2-ed   less
2      4   www.xyz/4-ed  equal
3      3   www.xyz/5-ed   more
4     67  www.xyz/66-ed   less

Вот несколько ссылок для дальнейшего чтения:

Надеюсь, это поможет, ура!

0 голосов
/ 20 января 2020

Вы можете сначала извлечь столбец URL из фрейма данных.

urls= df["url"]

Затем вам нужно будет получить доступ к каждому URL, проанализировать страницу html и получить цену. Вы можете использовать красивый суп для достижения этой цели. Но об этом можно предположить, только зная структуру html страницы.

Затем вы можете добавить рассчитанные цены к фрейму данных как valuesFromUrl. В этом фрейме данных вы можете применить функцию, которая проверяет, является ли столбец цены больше или меньше столбца priceFromUrl, и создает новый столбец с именем index.

Пример фрагмента:

import pandas as pd

def getMoreOrLess(price, priceFromUrl):
    result="equal"
    if price<priceFromUrl:
        result="less"
    elif price>priceFromUrl:
        result="more"
    return result

table = {'name': ['egg','ham'],
        'price': [2,34],
        'url':['www.xyz/1-ed','www.xyz/2-ed']
        }

df = pd.DataFrame(table, columns = ['name','price','url'])
urls= df["url"]
price=[]
for url in urls:
    # Do the beautiful soup code to extract price here and append to price
    #Let us say price = [4,32]
    price=[4,32]

df['priceFromUrl'] = price
df['index'] = df.apply(lambda x: getMoreOrLess(x['price'], x['priceFromUrl']), axis=1)
df=df.drop(columns='priceFromUrl')  #You can delete the column later
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...