Say*_*uda 1 python duplicates pandas
这段代码的目的是抓取一堆数据表,把它们变成pandas数据框,删除一些不需要的列并修复日期。
每个数据框有 2 列,第一个在每个数据框中称为(“发布日期”),另一列为每个数据框有不同的名称。
然后将这些表串联成一个统一的数据框,以'Release Date'列为索引,所以同时发生的事件必须在同一行。
当我尝试这段代码时:
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
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']]
df = df.drop(df.columns[-4:], axis=1).reset_index(drop=True)
df = df.head(50)
pd.to_datetime(df['Date'], format='%b %d, %Y %H:%M')
DataFrames.append(df)
return DataFrames
def rename(self):
FinalDataFrames = []
tables = self.table()
names = self.title()
for name, table in zip(names, tables):
table.rename(columns={'Date': 'Release Date', 'Actual': name}, inplace=True)
FinalDataFrames.append(table)
return FinalDataFrames
def finalDF(self):
dfs = self.rename()
dfs = [dfi.loc[~dfi.index.duplicated(keep='first')] for dfi in dfs]
df = pd.concat(dfs, axis=1, join='outer').sort_index(ascending=False)
df.astype('unicode')
pd.to_datetime(df['Release Date'], format='%b %d, %Y %H:%M')
df.set_index('Release Date')
print(df.head())
if __name__ == "__main__":
DataEngine().finalDF()
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
File "D:/Projects/Tutorial/database.py", line 71, in <module>
if __name__ == "__main__":
File "D:/Projects/Tutorial/database.py", line 66, in finalDF
pd.to_datetime(df['Release Date'], format='%b %d, %Y %H:%M')
File "C:\Users\Sayed\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 454, in to_datetime
result = _assemble_from_unit_mappings(arg, errors=errors)
File "C:\Users\Sayed\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 520, in _assemble_from_unit_mappings
raise ValueError("cannot assemble with duplicate keys")
ValueError: cannot assemble with duplicate keys
Run Code Online (Sandbox Code Playgroud)
该错误是您的 df 以某种方式重复列名的结果。在这种情况下会产生错误的 Pandas 的源代码如下所示:
from pandas import to_timedelta, to_numeric, DataFrame
arg = DataFrame(arg)
if not arg.columns.is_unique:
raise ValueError("cannot assemble with duplicate keys")
Run Code Online (Sandbox Code Playgroud)
我认为您的代码失败,因为您引用的列名pd.to_datetime(df['Release Date'], format='%b %d, %Y %H:%M')不是唯一的。
链接到熊猫源
| 归档时间: |
|
| 查看次数: |
4899 次 |
| 最近记录: |