Как я могу заменить нулевое значение в группе? - PullRequest
1 голос
/ 26 января 2020

Я создал этот фрейм данных. Я рассчитал разрыв, который искал, но проблема в том, что некоторые квартиры имеют одинаковую цену, и я получаю разницу в цене 0. Как я могу заменить значение 0 на разницу с последним меньшим цена той же группы.

например:

neighboorhood:a, bed:1, bath:1, price:5

neighboorhood:a, bed:1, bath:1, price:5

neighboorhood:a, bed:1, bath:1, price:3

neighboorhood:a, bed:1, bath:1, price:2

Я получаю разницу в цене 0,2,1, нан, и я ищу 2,2,1, нан ( кратко я не хочу сравнивать 2 квартиры с одинаковой ценой)

Заранее спасибо и хорошего дня.

data=[
    [1,'a',1,1,5],[2,'a',1,1,5],[3,'a',1,1,4],[4,'a',1,1,2],[5,'b',1,2,6],[6,'b',1,2,6],[7,'b',1,2,3]
]
df = pd.DataFrame(data, columns = ['id','neighborhoodname', 'beds', 'baths', 'price']) 

df['difference_price'] = ( df.dropna()
                             .sort_values('price',ascending=False)
                             .groupby(['city','beds','baths'])['price'].diff(-1) )

1 Ответ

1 голос
/ 26 января 2020

Я думаю, что вы можете удалить дубликаты в первую очередь для всех столбцов, использованных для groupby с diff, создать новый столбец в отфильтрованных данных и объединить последнее использование с левым соединением с оригиналом:

df1 = (df.dropna()
         .sort_values('price',ascending=False)
         .drop_duplicates(['neighborhoodname','beds','baths', 'price']))

df1['difference_price']  = df1.groupby(['neighborhoodname','beds','baths'])['price'].diff(-1)

df = df.merge(df1[['neighborhoodname','beds','baths','price', 'difference_price']], how='left')
print (df)
   id neighborhoodname  beds  baths  price  difference_price
0   1                a     1      1      5               1.0
1   2                a     1      1      5               1.0
2   3                a     1      1      4               2.0
3   4                a     1      1      2               NaN
4   5                b     1      2      6               3.0
5   6                b     1      2      6               3.0
6   7                b     1      2      3               NaN

Или вы можно использовать лямбда-функцию для заполнения 0 значений по группам, чтобы избежать неправильных выводов, если одна группа строк (данные перемещены из другой группы):

df['difference_price'] = (df.sort_values('price',ascending=False)
                            .groupby(['neighborhoodname','beds','baths'])['price']
                            .apply(lambda x: x.diff(-1).replace(0, np.nan).bfill()))

print (df)     
   id neighborhoodname  beds  baths  price  difference_price
0   1                a     1      1      5               1.0
1   2                a     1      1      5               1.0
2   3                a     1      1      4               2.0
3   4                a     1      1      2               NaN
4   5                b     1      2      6               3.0
5   6                b     1      2      6               3.0
6   7                b     1      2      3               NaN
...