繁体   English   中英

如何在此 Pandas 数据框中分组、排序和计算差异?

[英]How to group, sort and calculate difference in this pandas dataframe?

我创建了这个数据框,需要将我的数据分组到具有相同数量的床位、城市、浴室的类别中,并按价格对组中的每个元素进行排序(降序)。 其次,我需要找到每个价格与排名在同一组之后的价格之间的差异。 例如,结果应该是这样的:

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 with errors = '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

如果我理解正确:

将我的数据按相同数量的床位、城市、浴室和排序(降序)分组

所有不满足该值的数据都应该删除吗? (床和浴室不同的地方)。 这是我的代码,用于根据您的问题提供答案:

import numpy as np
import pandas as pd     
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_new = df[df['beds'] == df['baths']]
df_new = df_new.sort_values(['city','price'],ascending=[False,False]).reset_index(drop=True)
df_new['diff_price'] = df_new.groupby(['city','beds','baths'])['price'].diff(-1)
print(df_new)

输出:

   id    city  beds  baths price diff_price
0  17   paris     1      1     5        NaN
1  15   paris     1      1     3         -2
2   3  madrid     2      2    11        NaN
3   2  madrid     2      2     8         -3
4  11  madrid     2      2     7         -1
5  16  madrid     1      1     4        NaN
6  14  madrid     1      1     3         -1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM