首页 > 解决方案 > 如何在这个 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)

提前谢谢了。

标签: pythonpandasdataframegroup-bydiff

解决方案


我会用pd.to_numericwitherrors = '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

推荐阅读