Ошибка dataFrame.drop() в Python PywedgeCharts

Вопрос или проблема

Я пытался использовать Pywedge_Charts с файлом csv (простой файл csv с 3 столбцами (‘Штат’, ‘Налоги’, ‘Годовые_доходы’)), кодируя следующее:

import pandas as pd
import pywedge as pw

tax = pd.read_csv('C:/Users/XXXX/OneDrive/Documents/Python/Taxes.csv')

viz = pw.Pywedge_Charts(tax, c=None, y='State')

но я получаю следующее сообщение об ошибке:

TypeError                                 Traceback (most recent call last)
`your text`Cell In[28], line 1
----> 1 viz = pw.Pywedge_Charts(tax, c=None, y='Taxes')

File ~\anaconda3\Lib\site-packages\pywedge\pywedge.py:27, in Pywedge_Charts.__init__(self, train, c, y, manual)
     25 self.c = c
     26 self.y = y
---> 27 self.X = self.train.drop(self.y,1)
     28 self.manual = manual

TypeError: DataFrame.drop() takes from 1 to 2 positional arguments but 3 were given

Пробовал разные варианты, но не смог решить проблему. Есть ли идеи, как исправить эту ошибку?

Я новичок в Python, но это кажется базовым кодом, который не должен вызывать проблем. Пробовал присвоить другой столбец y, изменить файл csv, но я все равно сталкиваюсь с этой проблемой.

Заранее спасибо

С учетом того, что последняя версия pywedge была выпущена 20 января 2021 года, она естественно полагается на старую версию df.drop:

Старая сигнатура:

DataFrame.drop(labels=None, axis=0, index=None, columns=None, 
               level=None, inplace=False, errors="raise")

Новая сигнатура:

DataFrame.drop(labels=None, *, axis=0, index=None, columns=None, 
               level=None, inplace=False, errors="raise")

Обратите внимание на * во второй позиции в новой сигнатуре. Этот символ указывает, что все аргументы, которые следуют, должны передаваться как именованные аргументы. Смотрите эту документацию. В старой версии этот * отсутствует, поэтому вы могли написать:

df.drop('label', 1)

# это значит: df.drop(labels="label", axis=1)

Как видно из сообщения об ошибке, это реализация в pywedge.py:

self.train.drop(self.y,1)

Новая версия больше не распознает 1 как позиционный аргумент для axis. Следовательно, вам нужно написать:

df.drop('label', axis=1)

Решение 1

Понизить вашу версию pandas до 1.4.4 (или ниже).

Решение 2

Найдите установленный pywedge.py и исправьте все выражения .drop(...). Я насчитал четыре, начиная отсюда. То есть,

self.X = self.train.drop(self.y,1)

должно стать:

self.X = self.train.drop(self.y, axis=1)

Решит ли одно из этих решений все проблемы, – загадка. requirements.txt не уточняет версии для большинства зависимостей. Следовательно, оба решения лучше всего сочетать с маленькой молитвой.

Пример

Функция drop в pandas используется неправильно в библиотеке, которую вы использовали. Я создам пример, чтобы показать, почему этот код неверен.

import pandas as pd
data = {'A': [59, 11, 65, 95], 'B': [63, 87, 22, 87], 
        'C': [49, 51, 9, 99], 'D': [4, 39, 77, 65]}
df = pd.DataFrame(data)

df

    A   B   C   D
0  59  63  49   4
1  11  87  51  39
2  65  22   9  77
3  95  87  99  65

Попробуйте удалить столбец ‘A’ из df, и вы получите ту же ошибку, если упустите параметр axis.

df.drop('A', 1)

ошибка

TypeError: DataFrame.drop() takes from 1 to 2 positional arguments but 3 were given

Мы можем удалить столбец ‘A’ из df без ошибки, если не упустим параметр axis.

df.drop('A', axis=1)

Похоже, что библиотека pywedge, которую вы использовали, основана на более старой версии Pandas, и поэтому она упускает параметр axis в функции drop. Я думаю, что правильное понижение версии Pandas (возможно, 1.4.4, основываясь на ответе @ouroboros1) должно это исправить.

Ответ или решение

При использовании библиотеки Pywedge_Charts с файлом CSV у вас возникла ошибка, связанная с методом drop() в библиотеке Pandas. Давайте рассмотрим проблему подробно, предоставляя решения и рекомендации.

Описание проблемы

Ваша ошибка возникает при выполнении следующей строки кода:

viz = pw.Pywedge_Charts(tax, c=None, y='Taxes')

Где tax — это DataFrame, загруженный из файла CSV. Сообщение об ошибке сигнализирует о неправильном использовании метода drop():

TypeError: DataFrame.drop() takes from 1 to 2 positional arguments but 3 were given

Это происходит из-за изменения синтаксиса в новой версии библиотеки Pandas. Начиная с версии 1.5.0, метод drop() требует использования именованных аргументов для параметра axis, ввиду чего код self.train.drop(self.y, 1) больше не работает корректно.

Причина проблемы

В старых версиях Pandas метод drop() имел следующий сигнатурный вид:

DataFrame.drop(labels=None, axis=0, index=None, columns=None, ...)

В новых версиях добавлено *, что требует применения именованных аргументов после этого символа:

DataFrame.drop(labels=None, *, axis=0, index=None, columns=None, ...)

Поэтому код в библиотеке Pywedge, написанный для старой версии Pandas, не работает с новой и приводит к ошибке.

Возможные решения

Решение 1: Понизить версию Pandas

Одним из простых решений будет понижение версии библиотеки Pandas до 1.4.4 или ниже. Это можно сделать с помощью следующей команды в консоли:

pip install pandas==1.4.4

Это позволит использовать старый синтаксис метода drop() без изменений в коде Pywedge.

Решение 2: Изменение кода библиотеки Pywedge

Если понижение версии Pandas не подходит или вы хотите использовать более новую версию, вы можете вручную изменить код библиотеки Pywedge. Вам нужно найти установочный файл pywedge.py, и в нем изменить вызовы метода drop(), добавив именованный параметр axis:

Замените строки вида:

self.X = self.train.drop(self.y, 1)

на

self.X = self.train.drop(self.y, axis=1)

Эти изменения нужно внести во всех местах, где вызывается метод drop() в библиотеке Pywedge.

Пример использования

Приведем небольшой пример, чтобы проиллюстрировать проблему и ее решение:

import pandas as pd

# Создаем пример DataFrame
data = {'State': ['A', 'B', 'C'], 'Taxes': [1, 2, 3], 'Revenues_year': [100, 200, 300]}
df = pd.DataFrame(data)

# Пробуем удалить столбец 'State' без указания axis
try:
    df.drop('State', 1)
except TypeError as e:
    print(e)  # Выдает ошибку

# Корректное использование метода drop
df.drop('State', axis=1)  # Работает без ошибки

Заключение

Ваша проблема связана с несовместимостью версий библиотеки Pandas и Pywedge. Рекомендуем рассмотреть оба предложенных решения и выбрать наиболее подходящее для вас. Убедитесь, что изменения не повлияют на другие части вашего проекта.

Если у вас есть дополнительные вопросы или трудности, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...