Ошибка Python: ошибка значения: может преобразовать только массив размером 1 в скаляр Python

python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных, который выбирает самую низкую цену и продавца из json. Однако иногда я получаю эту ошибку: ValueError: can only convert an array of size 1 to a Python scalar это происходит только иногда, не всегда.

Вот код..

 import pandas

Data= []
Data =[{"A": "X1FFFFF", "Special":{"type": "USD"},"B": "0.11",}]
Data =[{"A": "X2FFFFF", "Special":{"type": "EUR"},"B": "0.122",}]
Data =[{"A": "X3FFFFF", "Special":{"type": "EUR"},"B": "0.1444",}]

Data = pandas.DataFrame(Data)
Data = Data.astype({"B": float})
Data = Data.astype({"A": str})

euro_rows = Data.loc[Data["Special"] == {'type': 'EUR'}]

lowest_price = euro_rows.loc[euro_rows['B'] == euro_rows['B'].min()]

seller = lowest_price['A'].item()
price  = lowest_price['B'].item()

print(seller)
print(price)
 

что я могу сделать, чтобы исправить эту ошибку?

Полная ошибка :

   File "Fuck.py", line 50, in GetLowestPriceAndSeller
    seller = lowest_price['seller'].item()
  File "/usr/local/lib/python3.8/site-packages/pandas/core/base.py", line 420, in item
    raise ValueError("can only convert an array of size 1 to a Python scalar")
ValueError: can only convert an array of size 1 to a Python scalar
 

Ответ №1:

Я предполагаю, что у вас есть несколько товаров в lowest_price, что было бы возможно, если бы они стоили одинаково, что также объясняет, почему это происходит только иногда.

Таким образом, виновником, вероятно, является вызов .item() , который ожидает один элемент, но у вас там есть массив.

Затем вы могли бы просто взять весь массив lowest_price, а не только элемент. Это немного зависит от того, что именно вы хотите сделать с данными, потому что, на мой взгляд, обстоятельства немного отличаются от того, что было у вас изначально.

Ответ №2:

Вы можете выбрать первое значение, если всегда существует хотя бы одно значение:

 seller = lowest_price['A'].iat[0]
price  = lowest_price['B'].iat[0]
 

Если возможно, иногда первое значение не существует, потому lowest_price что возможно пустое, используйте этот трюк для указания значения по умолчанию с iter помощью with next :

 seller = next(iter(lowest_price['A']), 'default')
price  = next(iter(lowest_price['B']), 'default')
 

Альтернативным решением является преобразование A в индекс, а затем получение минимального значения B и index ( A ) по минимальному значению с помощью Series.idxmin :

 lowest_price = euro_rows.set_index('A')['B']

seller = lowest_price.idxmin()
price  = lowest_price.min()

print(seller)
print(price)
 

Комментарии:

1. невозможно, чтобы это значение было пустым (я уверен, что это значение не является пустым), и все та же ошибка даже с .iat[0]

2. @IrinelIovan — Что такое ошибка?

3. Файл «Fuck.py «, строка 50, в файле GetLowestPriceAndSeller seller = lowest_price[‘продавец’].item().iat[0] «/usr/local/lib/python3.8/site-packages/pandas/core/base.py «, строка 420, в элементе raise ValueError(«может только преобразовать массив размером 1 в скаляр Python») ValueError: может толькопреобразовать массив размером 1 в скаляр Python

4. @IrinelIovan — код отличается, без .item()

5. Файл «Fuck.py «, строка 50, в файле GetLowestPriceAndSeller seller = lowest_price[‘продавец’].iat[0] «/usr/local/lib/python3.8/site-packages/pandas/core/indexing.py «, строка 2103, в getitem возвращает файл self.obj._get_value(*key, takeable=self._takeable) «/usr/local/lib/python3.8/site-packages/pandas/core/series.py «, строка 958, в_get_value возвращает значение self._values[label] Ошибка индекса: индекс 0 выходит за пределы оси 0 с размером 0