Вопрос или проблема
Я пытался использовать 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. Рекомендуем рассмотреть оба предложенных решения и выбрать наиболее подходящее для вас. Убедитесь, что изменения не повлияют на другие части вашего проекта.
Если у вас есть дополнительные вопросы или трудности, не стесняйтесь обращаться за помощью!