python - 如何在这个 pandas 数据框中对差异进行分组、排序和计算?
问题描述
我创建了这个数据框,需要将我的数据分组到具有相同数量的床、城市、浴室的类别中,并按价格对组中的每个元素进行排序(降序)。其次,我需要找出每个价格与排在同一组之后的价格之间的差异。例如结果应该是这样的:
1 床 1 浴室, 马德里, 10
1 床 1 浴室, 马德里, 8
1 床 1 浴室, 马德里, 5
1 床 1 浴室, 马德里, 1
我应该得到2、3、4...
我尝试了一些代码,它似乎比我预期的要远...
data=[[1,'paris',1,2,'10'],[2,'madrid',2,2,8],[3,'madrid',2,2,11],[4,'paris',1,2,6],[5,'paris',1,2,5],[6,'madrid',2,1,7],[7,'paris',2,1,7],[8,'paris',2,1,7],[9,'madrid',1,4],[10,'paris',2,1,3],[11,'madrid',2,2,7],[12,'paris',2,3,12],[13,'madrid',2,3,7],[14,'madrid',1,1,3],[15,'paris',1,1,3],[16,'madrid',1,1,4],[17,'paris',1,1,5]]
df=pd.DataFrame(data, columns=['id','city','beds','baths','price'])
df
df['gap'] = df.sort_values('price',ascending=False).groupby(['city','beds','baths'])['price'].diff()
print (df)
提前谢谢了。
解决方案
我会用pd.to_numeric
witherrors = 'coerce'
去掉price
列中的字符串,然后我会计算差异而不考虑那些价格未知的房间(使用DataFrame.dropna
)。然后我在 DataFrame 中显示结果排序并且没有排序:
df['price']=pd.to_numeric(df['price'],errors = 'coerce')
df['difference_price'] = ( df.dropna()
.sort_values('price',ascending=False)
.groupby(['city','beds','baths'])['price'].diff(-1) )
或使用GroupBy.shift
:
df['difference_price'] = df['price'].sub( df.dropna()
.sort_values('price',ascending=False)
.groupby(['city','beds','baths'])
.price
.shift(-1) )
显示结果
print(df,'\n'*3,'Sorted DatFrame: ')
print(df.sort_values(['city','beds','baths','price'],ascending = [True,True,True,False]))
输出
id city beds baths price difference_price
0 1 paris 1 2 10.0 4.0
1 2 madrid 2 2 8.0 1.0
2 3 madrid 2 2 11.0 3.0
3 4 paris 1 2 6.0 1.0
4 5 paris 1 2 5.0 NaN
5 6 madrid 2 1 7.0 NaN
6 7 paris 2 1 7.0 0.0
7 8 paris 2 1 7.0 4.0
8 9 madrid 1 4 NaN NaN
9 10 paris 2 1 3.0 NaN
10 11 madrid 2 2 7.0 NaN
11 12 paris 2 3 12.0 NaN
12 13 madrid 2 3 7.0 NaN
13 14 madrid 1 1 3.0 NaN
14 15 paris 1 1 3.0 NaN
15 16 madrid 1 1 4.0 1.0
16 17 paris 1 1 5.0 2.0
Sorted DatFrame:
id city beds baths price difference_price
15 16 madrid 1 1 4.0 1.0
13 14 madrid 1 1 3.0 NaN
8 9 madrid 1 4 NaN NaN
5 6 madrid 2 1 7.0 NaN
2 3 madrid 2 2 11.0 3.0
1 2 madrid 2 2 8.0 1.0
10 11 madrid 2 2 7.0 NaN
12 13 madrid 2 3 7.0 NaN
16 17 paris 1 1 5.0 2.0
14 15 paris 1 1 3.0 NaN
0 1 paris 1 2 10.0 4.0
3 4 paris 1 2 6.0 1.0
4 5 paris 1 2 5.0 NaN
6 7 paris 2 1 7.0 0.0
7 8 paris 2 1 7.0 4.0
9 10 paris 2 1 3.0 NaN
11 12 paris 2 3 12.0 NaN
推荐阅读
- yocto - Yocto 映像中的救援分区
- chirp - 如何在 keil 中编译基于 stm32f746g-discovery 的啁啾代码
- html - 如何将链接添加到 Facebook Like 按钮
- php - 重定向后会话变量丢失 - PHP 7.3
- arrays - 如何在reactjs中循环遍历数组
- javascript - 选择 selectedindex 时,使用下拉列表的选定项填充文本框
- python - python pandas groupby意外的空列
- php - 在 Woocommerce 单品页面中更改并保存产品价格
- google-cloud-platform - 尝试免费注册云身份会强制注册 G-Suite 高级版 14 天免费试用
- python - 想要从其中包含不同字符串的列中分离整数和浮点数