此代码的目的是刮起一堆长度不同(每张表的行数不同)的数据表,将它们变成pandas数据帧,删除一些不必要的列并确定日期。
以上所有方法都可以,但是当我尝试重命名列时出现错误。
这是数据样本:
实际日期
0 2018年10月15日21:30
2018年9月1日21:30 0.7%
2018年8月2日21:30 0.3%
2018年7月3日21:30 -0.1%
2018年6月4日21:30 -0.2%
2018年5月5日21:30 -0.2%
2018年4月10日21:30 -1.1%
代码如下:
UIPageViewController
这是错误:
回溯(最近通话最近一次):
文件“ D:/Projects/Tutorial/database.py”,第67行,在 x.rename()
文件“ D:/Projects/Tutorial/database.py”,第59行,重命名 tabels = self.table()
文件“ D:/Projects/Tutorial/database.py”,表中的第54行 如果df不在DataFrames中:
文件“ C:\ Users \ Sayed \ Anaconda3 \ lib \ site-packages \ pandas \ core \ ops.py”,行1613,在f中
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import pandas as pd
class DataEngine:
def __init__(self):
self.urls = open(r"C:\Users\Sayed\Desktop\script\sample.txt").readlines()
self.driver = webdriver.Chrome(r"D:\Projects\Tutorial\Driver\chromedriver.exe")
self.wait = WebDriverWait(self.driver, 10)
def title(self):
names = []
for url in self.urls:
self.driver.get(url)
title = self.driver.find_element_by_xpath('//*[@id="leftColumn"]/h1').text
if title not in names:
names.append(title)
return names
def table(self):
DataFrames = []
for url in self.urls:
self.driver.get(url)
while True:
try:
item = self.wait.until(
ec.visibility_of_element_located((By.XPATH, '//*[contains(@id,"showMoreHistory")]/a')))
self.driver.execute_script("arguments[0].click();", item)
except Exception:
break
df = pd.DataFrame(columns=['Release Date', 'Time', 'Actual', 'Forecast', 'Previous'])
pos = 0
for table in self.wait.until(
ec.visibility_of_all_elements_located((By.XPATH, '//*[contains(@id,"eventHistoryTable")]//tr'))):
data = [item.text for item in table.find_elements_by_xpath(".//*[self::td]")]
if data:
df.loc[pos] = data[0:5]
pos += 1
df["Date"] = df["Release Date"].apply(lambda date: date[:12]) + " " + df["Time"]
df.astype('unicode')
df = df[['Date', 'Actual', 'Forecast', 'Previous', 'Release Date', 'Time']]
pd.to_datetime(df['Date'], format='%b %d, %Y %H:%M')
df.drop(df.columns[-1], axis=1, inplace=True)
df.drop(df.columns[-1], axis=1, inplace=True)
df.drop(df.columns[-1], axis=1, inplace=True)
df.drop(df.columns[-1], axis=1, inplace=True)
df = df.reset_index()
if df not in DataFrames:
DataFrames.append(df)
return DataFrames
def rename(self):
tabels = self.table()
names = self.title()
for tabel, name in zip(tabels, names):
tabel.rename({'Actual': name})
x = DataEngine()
x.rename()
ValueError:只能比较标记相同的DataFrame对象
答案 0 :(得分:0)
首先,您无需多次调用df.drop
,从而使阅读代码更直观。更改:
df.drop(df.columns[-1], axis=1, inplace=True)
df.drop(df.columns[-1], axis=1, inplace=True)
df.drop(df.columns[-1], axis=1, inplace=True)
df.drop(df.columns[-1], axis=1, inplace=True)
df = df.reset_index()
收件人:
df = df.drop(df.columns[-4:], axis=1).reset_index(drop=True)
我添加了drop=True
,因为我怀疑您不再需要它了。
第二,要真正回答您的问题,您的问题实际上是在您呼叫if df not in DataFrames
的线路上发生的。在这一行上,Python有效地返回了:
not any(all(df == df_i) for df_i in DataFrames)
当它评估df not in DataFrames
时。
如果df == df_i
没有相同的列或相同的索引,则此比较将失败(特别是在DataFrame
)。
尝试输入以下内容:
try:
if df not in DataFrames:
DataFrames.append(df)
except ValueError:
for df_i in DataFrames:
print(df.columns)
print(df.columns == df_i.columns)
print(df.index == df_i.index)
可能您会发现差异。