#python #pandas #pandas-groupby
#питон #панды #панды-групповые
Вопрос:
У меня есть фрейм данных pandas со следующими столбцами, представляющими интерес — код продукта и цена. Я хотел бы увидеть стандартное отклонение для продуктов с тем же кодом.
df.price = pd.to_numeric(df.price, errors='raise') len(df[df.price.isna()]) Out: 0 df.groupby(['productcode'])['price'].describe() count unique top freq productcode T1H5T 1 1 38 1 T1J0T 1 1 11 1 T1L6E 1 1 24 1 T1H0G9 1 1 69 1
Как вы можете видеть, большинство кодов продуктов отображаются только один раз. Когда я запускаю описание, такие показатели, как std, среднее значение и другие, по какой-то причине не отображаются.
Когда я специально запрашиваю выполнение стандартного отклонения, я получаю следующее
df.groupby(['productcode'])['price'].std(ddof=0) Out: _ df[['productcode', 'price']].groupby(['productcode']).mean() Out: DataError: No numeric types to aggregate
Комментарии:
1. Привет, каков результат
df.head(6).to_dict()
?2. {‘код товара’: {0: ‘T1H4K’, 1: ‘T1K6X’, 2: ‘T1H4K’, 3: ‘T1H4K’, 4: ‘T1H6T’, 5: ‘T1H4K’}, ‘цена’: {0: ’47’, 1: ’28’, 2: ’47’, 3: ’47’, 4: ’19’, 5: ’47’}}
Ответ №1:
Итак, учитывая следующий игрушечный фрейм данных:
import pandas as pd df = pd.DataFrame( { "productcode": { 0: "T1H 4K3", 1: "T1H6X", 2: "T1H4K", 3: "T1H4K", 4: "T1H6X", 5: "T1H 4K3", }, "price": {0: "47", 1: "28", 2: "47", 3: "25", 4: "19", 5: "47"}, } ) print(df) # Outputs productcode price 0 T1H 4K3 47 1 T1H6X 28 2 T1H4K 47 3 T1H4K 25 4 T1H6X 19 5 T1H 4K3 47
Вы можете получить стандартное отклонение для продуктов с таким же кодом, как этот:
print(df.groupby("productcode").std()) # Outputs price productcode T1H 4K3 0.000000 T1H4K 15.556349 T1H6X 6.363961
Комментарии:
1. Спасибо тебе за помощь, Лоран. Код возвращается со следующей ошибкой: Ошибка данных: Нет числовых типов для агрегирования. Я могу запустить тот же код с помощью функции count (). Я опубликую набор данных немного позже, как ранее просил @jezrael.
Ответ №2:
Пройдя через свою ошибку несколько раз, по-видимому, ошибка заключалась в том, что, когда я использовал to_numeric, либо с ошибками, вызванными, либо принудительно, на самом деле тип данных столбца не менялся, он оставался классифицированным как объект. С помощью
df.price = df.price.astype(float)
смог решить эту проблему. Вот также, почему, когда я попытался использовать метод description (), в нем были перечислены только показатели, применимые к категориальным переменным. Я очень признателен за ваши ответы @Laurent и @jezrael!