Найти самую старую (минимальную) дату в нефильтрованной таблице для значения ключа в отфильтрованной таблице

#python #python-3.x #pandas #numpy

#python #python-3.x #pandas #numpy

Вопрос:

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

df_table1

 key name product timestamp
1   AB   TR01    01.01.20
2   AC   ZT83    01.01.20
3   AD   RE76    01.01.20
  

df_table2

 key name product timestamp
1   AB   TR01    01.01.20
2   AC   ZT83    01.01.20
3   AD   RE76    01.01.20
5   AE   GT51    12.07.20
6   AE   GT51    12.07.20
...
1   AB   AG01    01.04.05
2   AC   MN43    03.01.03
3   AD   RZ65    03.09.01
  

Опять же, таблица 1 является фильтрованной версией таблицы 2 по некоторым определенным критериям.

Моя цель — найти самую старую (минимальную) дату для всех ключей в таблице 1 и получить следующий результат:

df_table1

 key name product timestamp min_date
1   AB   TR01    01.01.20  01.04.05
2   AC   ZT83    01.01.20  03.01.03
3   AD   RE76    01.01.20  03.09.01
  

Есть ли способ сделать это без перебора table2 для каждого ключа в table1?

Комментарии:

1. Как вы думаете min , datetimes?

2. @jezrael да, это правильно, я ищу самую старую дату — извините за путаницу! Кроме того, ключевым столбцом является ключ клиента, то есть уникальный идентификатор.

3. Хорошо, ответ был отредактирован.

Ответ №1:

to_datetime Сначала использовать, а затем агрегировать min и добавлять к первому DataFrame по Series.map или DataFrame.join :

 df_table1['timestamp'] = pd.to_datetime(df_table1['timestamp'], format='%d.%m.%y')
df_table2['timestamp'] = pd.to_datetime(df_table2['timestamp'], format='%d.%m.%y')

df_table1['min_date'] = df_table1['key'].map(df_table2.groupby('key')['timestamp'].min())

print (df_table1)
   key name product  timestamp   min_date
0    1   AB    TR01 2020-01-01 2005-04-01
1    2   AC    ZT83 2020-01-01 2003-01-03
2    3   AD    RE76 2020-01-01 2001-09-03
  

 s = df_table2.groupby('key')['timestamp'].min().rename('min_date')
df_table1 = df_table1.join(s, on='name')
  

Ответ №2:

dict name:timestamp для каждой группы в table1 столбце и map для столбца name in table2

 df_table1['max_date']=df_table1['name'].map(df_table2.groupby('name')['timestamp'].last().to_dict())



    key name product timestamp  max_date
0    1   AB    TR01  01.01.20  01.04.05
1    2   AC    ZT83  01.01.20  03.01.03
2    3   AD    RE76  01.01.20  03.09.01
  

Ответ №3:

Вы могли бы сделать:

 df_table2_max = df_table2.groupby(['key']).agg(max_date=('timestamp','max')).reset_index()
df_table1 = df_table1.merge(df_table2_max, on='key', how='left')
  

Мне кажется, что вы используете как ключ, так и имя, чтобы найти максимальную дату. В этом случае сгруппируйте и объедините эти два столбца