#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')
Мне кажется, что вы используете как ключ, так и имя, чтобы найти максимальную дату. В этом случае сгруппируйте и объедините эти два столбца