Групповое с лямбда-функцией и несколькими столбцами - PullRequest
0 голосов
/ 06 июня 2019

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

df = 
parcel  date            amount
101469  5/29/2015 0:00  513000
101469  4/25/2017 0:00  570000
101470  1/6/1995 0:00   75000
101470  8/15/1995 0:00  385000
101470  12/31/2001 0:00 417500


df_grouped = df.groupby("parcel").agg({'date': lambda grp: [grp.nlargest(1).iloc[-1], grp.nlargest(2).iloc[-1]
]})

Текущий код правильно группирует данные по участкам, а также определяет самые последние и вторые самые последние даты продажи. Однако я не могу добавить соответствующую цену продажи для каждого.

Вот обычно ожидаемый результат, который я хотел бы увидеть. Одна сгруппирована по строке для посылки, которая показывает самую последнюю продажу, вторая самая последняя продажа, самая последняя сумма продажи, вторая самая последняя продажа: enter image description here

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

решаемая.Оригинальное решение здесь: Применение нескольких функций к нескольким групповым столбцам

def f(x):
        d = {}
        d['most_recent_sale'] = x["date"].nlargest(1).iloc[-1]
        d['second_most_recent_sale'] = x["date"].nlargest(2).iloc[-1]
        d['most_recent_price'] = x.loc[x["date"] == d["most_recent_sale"], "amt_Price"].values[0]
        d['second_most_recent_price'] = x.loc[x["date"] == d["second_most_recent_sale"], "amt_Price"].values[0]

        return pd.Series(d, index=['most_recent_sale', 'second_most_recent_sale', 'most_recent_price', 'second_most_recent_price'])

    df_grouped = df.groupby("id_Pid").apply(f)
0 голосов
/ 06 июня 2019

Используя эти шаги:

  • создайте df1, используя sort_values, groupby и выберите две верхние строки каждой группы
  • , добавьте key столбцы вdf1 с использованием cumcount (преобразовать его в str)
  • set_index и unstack до нужного результата
  • использовать мультииндекс map для преобразования нужных столбцов в требуемыйимена столбцов
df1 = df.sort_values('date', ascending=False).groupby('parcel').head(2)
df1['key'] = df1.groupby(['parcel']).parcel.cumcount().add(1).astype(str)
df1 =  df1.set_index(['parcel', 'key']).unstack()
df1.columns = df1.columns.map('_'.join)

Out[1268]:
           date_1     date_2  amount_1  amount_2
parcel
101469 2017-04-25 2015-05-29    570000    513000
101470 2001-12-31 1995-08-15    417500    385000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...