Как сгруппировать, отсортировать и рассчитать разницу в этом pandas кадре данных? - PullRequest
2 голосов
/ 15 января 2020

Я создал этот фрейм данных, и мне нужно сгруппировать данные в категории с одинаковым количеством кроватей, городов, бань и отсортировать (убывать) каждый элемент в группе по цене. Во-вторых, мне нужно найти разницу между каждой ценой и ценой, попавшей в одну группу. Например, результат должен быть таким:

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)

Большое спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Я бы использовал pd.to_numeric с 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
0 голосов
/ 15 января 2020

Если я правильно понимаю, с помощью:

сгруппируйте мои данные в категории с одинаковым количеством кроватей, города, бани и сортируйте (по убыванию)

Все данные, которые не выполняет значение должно быть удалено? (Где кровати и бани разные). Это мой код для ответа на вашу проблему:

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
...