Python панды переименовать фрейм данных - PullRequest
0 голосов
/ 27 сентября 2018

Цель этого кода - очистить несколько таблиц данных различной длины (разное количество строк в таблице), превратить их в фреймы данных pandas, удалить некоторые ненужные столбцы и исправить дату.

Все вышеперечисленное работает нормально, но когда я попытался переименовать столбец, я получил ошибку.

Вот пример данных:

Дата фактическая

0 15 октября 2018 г. 21:30

1 сентября 09, 2018 21:30 0,7%

2 августа 08, 2018 21:30 0,3%

3 июля 09, 2018 21:30 -0,1%

4 июня, 2018 г. 21:30 -0,2%

5 мая, 2018 г. 21:30 -0,2%

6, 10 апреля 2018 г. 21:30 -1,1%

Вот код:

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()

Вот ошибка:

Трассировка (последний последний вызов):

Файл "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

raise ValueError('Can only compare identically-labeled '

ValueError:Может сравнивать только объекты DataFrame с одинаковыми метками

1 Ответ

0 голосов
/ 27 сентября 2018

Прежде всего, ваши множественные вызовы на 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)

Скорее всего, вы обнаружите расхождения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...