Pandas dataframe 将计算应用于选定的行

Pandas dataframe apply calculations to selected rows

我正在尝试使用中值绝对偏差计算数据集中的离群值。我的数据集是 3 列,2000 行,格式如下:

Km      Price   id
139000  8500    2010 holden cruze cdx jg auto
173000  8500    2010 holden cruze cdx jg auto
95000   8800    2008 honda civic vti-l auto
141000  8800    2010 holden cruze cdx jg auto
169078  8880    1999 mazda mx-5 manual

我怎样才能像下面这样进行数组计算。我希望每一行都有一个 'median' 值,该值应该是具有相同 id 的所有行的中位数。

model = '2010 holden cruze cdx jg auto'
data[data['id']==model]['median'] = data[data['id']==model]['Price'].median()

下面的语句为每个模型提供了正确的中位数,我只是不知道如何快速将它应用到 'median' 列中的每一行。

median = data[data['id']==model]['Price'].median()

或者,我的中值绝对偏差方法是否错误 - 是否有 quicker/easier 方法可以用 pandas/numpy 做到这一点?

您可以使用函数 groupby and map:

data['median'] = data['id'].map(data.groupby('id')['Price'].median())
print data

输出:

       Km  Price                             id  median
0  139000   8500  2010-holden-cruze-cdx-jg-auto    8500
1  173000   8500  2010-holden-cruze-cdx-jg-auto    8500
2   95000   8800    2008-honda-civic-vti-l-auto    8800
3  141000   8800  2010-holden-cruze-cdx-jg-auto    8500
4  169078   8880         1999-mazda-mx-5-manual    8880

您可以使用 transform 其中 returns 与数据帧长度相同的系列:

df['median'] = df.groupby('id').Price.transform('median')

>>> df
       Km  Price                             id  median
0  139000   8500  2010-holden-cruze-cdx-jg-auto    8500
1  173000   8500  2010-holden-cruze-cdx-jg-auto    8500
2   95000   8800    2008-honda-civic-vti-l-auto    8800
3  141000   8800  2010-holden-cruze-cdx-jg-auto    8500
4  169078   8880         1999-mazda-mx-5-manual    8880