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