【问题标题】:Python Pandas compare two dataframes then editPython Pandas 比较两个数据框然后编辑
【发布时间】:2022-01-13 00:48:33
【问题描述】:

首先抱歉,如果这是重复的,我是初学者,所以我不太了解别人问题的全部含义。

我正在尝试为一个学校项目编写一个脚本,该脚本通过一个带有多个链接的大 Excel 文件运行,并从网页上抓取价格,将其与 Excel 中实际价格列中的价格进行比较。如果发现没有区别:太好了!但如果是这样,它应该使用刚刚抓取的新价格来编辑价格。

例如

Excel file : 

| Link        | Price          |
| --------    | -------------- |
| Product1    | 119            |
| Product2    | 89             |

Scraped data : 

| Price          |
| -------------- |
| 119            |
| 91             |

If this scenario happens, the Excel file should be edited to become like this : 

| Link        | Price          |
| --------    | -------------- |
| Product1    | 119            |
| Product2    | 91             |

目前我只能将价格抓取到列表中并将 Excel 文件转换为 Dataframe,但我真的不知道下一步该做什么......

这是我的代码

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

b =[]
tableau = pd.read_excel (r'PriceTrackerTrails\liens.xlsx')

links = pd.DataFrame(tableau, columns=['prix','liens'])

for i in links.index:
    html = requests.get(links['liens'][i]).text
    soup = bs(html, 'lxml')
    a = soup.find('span', {"itemprop":"price"}).text
    b.append(a)

print(links['prix'])
print(b)

输出:

0    139,00
1        98
Name: prix, dtype: object
['139,00', '112,00']

Excel 文件如下所示:

提前谢谢你!

【问题讨论】:

  • 在您的 for 循环中,您可以使用来自以下位置的值更新 links['prix'] 中的值:links.loc[i, 'prix'] = a
  • 非常感谢@frederick-douglas-pearce 完美运行。我还设法让它在同一个 xlsx 文件中写入更改。但我无法弄清楚如何创建一个仅包含已编辑行的新数据框(或列表列表),这意味着那些价格因 links.loc[i, 'prix'] = a 而改变的行。我需要它来创建一个小表并通过电子邮件发送以通知更改,我知道如何做 SMTP 电子邮件部分,我只是不知道如何创建一个只有行数据的表编辑了他们的价格。再次非常感谢弗雷德里克!

标签: python excel pandas dataframe beautifulsoup


【解决方案1】:

在for循环中,将links['prix']中的值更新为a中的值,如下所示:

for i in links.index:
    html = requests.get(links['liens'][i]).text
    soup = bs(html, 'lxml')
    a = soup.find('span', {"itemprop":"price"}).text
    b.append(a)
    links.loc[i, 'prix'] = a

要访问哪些行有价格更新,我会以不同的方式执行此操作,并在链接数据框中创建一个新列来存储新价格,而不是覆盖“prix”列中的值,并创建列表,b。这样可以更容易地验证数据,并且不需要单独的列表b。为此,您只需将 loc 方法更改为新的列名:

for i in links.index:
    html = requests.get(links['liens'][i]).text
    soup = bs(html, 'lxml')
    a = soup.find('span', {"itemprop":"price"}).text
    b.append(a)
    links.loc[i, 'prix_new'] = a

然后创建一个新的数据框,其中仅包含价格发生变化的行,如下所示:

price_updated = links[links['prix']!=links['prix_new']].reset_index()

reset_index 使这个新数据帧的行索引从 0 开始(默认情况下会复制)。如果要保留行索引以使其与 links 数据帧匹配,则将 reset_index 替换为 copy 这样您就不会收到 SettingWithCopyWarning 警告,即有关更改切片副本上的值的警告来自 DataFrame。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多