Оба фрейма данных имеют столбец с именем «uid» (уникальный идентификатор некоторых объектов). UID обоих фреймов данных одинаковы, они относятся к одним и тем же объектам. Однако в первом кадре данных каждый объект имеет только одну запись (одну строку), а во втором каждый объект имеет несколько записей:
Код: Выделить всё
df_characteristics
index uid char1 char2 char3
0 123 'blah' 'blah' 'blah'
1 456 'blah' 'blah' 'blah'
... ... ... ... ...
40 987 'blah' 'blah' 'blah'
df_prices
index uid date price
0 123 02-02-2000 11100
1 123 01-01-2000 22200
2 123 03-03-2000 44000
3 123 04-04-2000 66000
4 456 03-03-2000 77700
5 456 02-02-2000 88800
6 456 04-04-2000 66600
... ... ... ...
98 987 01-01-2005 12300
99 987 04-04-2005 45600
100 987 05-05-2005 78900
- рассмотреть все uids из первого кадра данных,
- сгруппировать второй кадр данных с группой (строк) для каждого uid,
- отсортировать каждую группу (т. е. каждый uid) по столбцу «дата»,
- возьмем элемент в столбце «цена», соответствующий «самой старой»
(минимальной) дате для каждой группы, - наконец, создадим новый столбец в первый кадр данных (df_characteristics) и вставьте цену, найденную на предыдущих шагах, в соответствии с (каждым) одинаковым uid.
Код: Выделить всё
df_characteristics
index uid char1 char2 char3 price
0 123 'blah' 'blah' 'blah' 22200
1 456 'blah' 'blah' 'blah' 88800
... ... ... ... ... ...
40 987 'blah' 'blah' 'blah' 12300
Код: Выделить всё
df_characteristics['price'] = pd.Series(dtype='int')
for index, row in df_characteristics.iterrows():
uid = row['uid']
group = df_prices.loc[df_prices['uid']==uid]
groupsorted = group.sort_values('date')
firstrow = groupsorted.iloc[0]
price = firstrow['price']
df_characteristics.at[index, 'price'] = price
Я тщательно проверил все вопросы/ответы в этом вопросе, но ни одного из них подходит для моей задачи. В частности, в своей задаче я не могу использовать сводку, так как мне не нужны агрегированные данные. Мне нужно отсортировать данные по «дате», а затем выбрать один элемент в столбце «цена», тот, который находится в той же строке, что и самая старая отсортированная дата. Итак, никакого агрегирования и поворота.
Подробнее здесь: https://stackoverflow.com/questions/783 ... etween-two