Изменение производного поля на плавающее и получение среднего значения производного поля - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть фрейм данных с именем FP с 13 столбцами, я получил новое поле с именем price/sqm и отбросил 10 столбцов.

FP['price/sqm'] = FP['price'] / FP['floor_area_sqm']
FP = FP.loc[:,['year', 'town', 'type', 'price/sqm']]

Фрейм данных имеет 700 000 строк и выглядит примерно так:

   year   town    type     price/sqm
0  1990   AMK   1 ROOM    290.322581
1  1990   AMK   1 ROOM    193.548387
2  1990   AMK   1 ROOM    258.064516
3  1990   AMK   1 ROOM    193.548387
4  1990   AMK   3 ROOM    646.575342
5  1990   AMK   3 ROOM    686.567164

Я пытаюсь усреднить price/sqm согласно ['year','town','type'], используя код ниже, но я получаю TypeError: incompatible index of inserted column with frame index

FP['avg_price/sqm'] = FP.groupby(['year', 'town', 'type'])['price/sqm'].aggregate(mean)

У меня есть похожий код для другого фрейма данных, который работает, поэтому я не уверен, почему он не работает для этого кода. Другой код gdp['yearly_gdp'] = gdp.groupby(['year'])['value'].transform(sum)

Я предполагаю, что это потому, что price/sqm - это str, и я попробовал следующие коды, чтобы преобразовать его в число с плавающей точкой, но я либо получаю сообщение об ошибке, либо он все равно возвращается как str.

FP['price/sqm'] = float(FP['price/sqm'])
FP['price/sqm'] = FP['price/sqm'].astype(float)
FP['price/sqm'] = pd.to_numeric(FP['price/sqm'], errors = 'coerce')
FP[['price/sqm']] = FP[['price/sqm']].apply(pd.to_numeric)

Может кто-нибудь посоветовать мне, как это исправить?

FP.dtypes:

   year   town    type     price/sqm
0  1990   AMK   1 ROOM    290.322581
1  1990   AMK   1 ROOM    193.548387
2  1990   AMK   1 ROOM    258.064516
3  1990   AMK   1 ROOM    193.548387
4  1990   AMK   3 ROOM    646.575342
5  1990   AMK   3 ROOM    686.567164
year        object
town        object
type        object
price/sqm   float64
dtype: object

df1.dtypes:

month               object
town                object
type                object
block               object
street_name         object
storey_range        object
floor_area_sqm      float64
flat_model          object
lease_commence_date int64
resale_price        int64
dtype:       object

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Вы можете использовать:

FP['avg_price/sqm'] = FP.groupby(['year', 'town', 'type'])['price/sqm'].mean()

и

gdp['yearly_gdp'] = gdp.groupby(['year'])['value'].sum()

вам не нужно использовать aggregate или transform

Если price/sqm - это число с плавающей запятой, просто преобразуйте его, используя:

FP['price/sqm'].astype(float)

Надеюсь, это решит вашу проблему.

0 голосов
/ 01 сентября 2018

Я думаю, что это сработает для вас, потому что вы преобразуете результаты в соответствии с индексацией фрейма данных

FP['avg_price/sqm'] = FP.groupby(['year', 'town', 'type'])['price/sqm'].transform(lambda x:x.mean())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...