Генерация столбца на основе двух кадров данных - PullRequest
0 голосов
/ 25 октября 2019

У меня есть датафрейм df1, который имеет:

F_Id    I_Code  F_Date
FT-56832    2   01/09/2019
FT-93828    1   01/09/2019
FT-13853    2   02/09/2019
FT-18858    3   02/09/2019
FT-19010    2   03/09/2019
FT-62064    5   02/09/2019
FT-94494    4   03/09/2019
FT-73594    2   03/09/2019
FT-78590    3   01/09/2019
FT-14296    4   01/09/2019
FT-82529    3   03/09/2019
FT-33266    3   04/09/2019
FT-58456    4   02/09/2019
FT-16693    4   04/09/2019
FT-69073    4   02/09/2019
FT-69649    1   05/09/2019

для каждого (I_code, F_Date) с ним связано 5 разных идентификаторов.

У меня есть другой фрейм данных df2, который имеет следующиеcolumns:

F_Date  num_i_found
01/09/2019  5
01/09/2019  3
02/09/2019  5
02/09/2019  5
03/09/2019  3
02/09/2019  4
03/09/2019  4
03/09/2019  5
01/09/2019  5
01/09/2019  4
03/09/2019  3
04/09/2019  5
02/09/2019  4
04/09/2019  5
02/09/2019  4
05/09/2019  4

Я хочу сгенерировать новый столбец ID_found в df2 так, чтобы это был массив с идентификаторами.

например, для 01.09.2009 num_i_found равно 4, тогда ID_found будет 4 ID из 5 от df1. (FT-56832, FT-93828, F-78590, ...).

Есть ли у панды способ достичь того же самого?

1 Ответ

0 голосов
/ 25 октября 2019

Создание словаря списков и фильтрация путем индексации по num_i_found значениям:

Уведомление : если значения не совпадают, как для первых строк, они только в выборочных данных имеют значение 4значения для 01/09/2019, я предполагаю, что в реальных данных все 5 значений в d для каждой даты и времени, поэтому работайте так, как вам нужно.

d = df1.groupby('F_Date')['F_Id'].apply(list).to_dict()

print (d)
{'01/09/2019': ['FT-56832', 'FT-93828', 'FT-78590', 'FT-14296'],
 '02/09/2019': ['FT-13853', 'FT-18858', 'FT-62064', 'FT-58456', 'FT-69073'],
 '03/09/2019': ['FT-19010', 'FT-94494', 'FT-73594', 'FT-82529'], 
 '04/09/2019': ['FT-33266', 'FT-16693'], 
 '05/09/2019': ['FT-69649']}

df2['new'] = df2.apply(lambda x: d.get(x['F_Date'], [])[:x['num_i_found']], axis=1)
print (df2)
        F_Date  num_i_found                                                new
0   01/09/2019            5           [FT-56832, FT-93828, FT-78590, FT-14296]
1   01/09/2019            3                     [FT-56832, FT-93828, FT-78590]
2   02/09/2019            5  [FT-13853, FT-18858, FT-62064, FT-58456, FT-69...
3   02/09/2019            5  [FT-13853, FT-18858, FT-62064, FT-58456, FT-69...
4   03/09/2019            3                     [FT-19010, FT-94494, FT-73594]
5   02/09/2019            4           [FT-13853, FT-18858, FT-62064, FT-58456]
6   03/09/2019            4           [FT-19010, FT-94494, FT-73594, FT-82529]
7   03/09/2019            5           [FT-19010, FT-94494, FT-73594, FT-82529]
8   01/09/2019            5           [FT-56832, FT-93828, FT-78590, FT-14296]
9   01/09/2019            4           [FT-56832, FT-93828, FT-78590, FT-14296]
10  03/09/2019            3                     [FT-19010, FT-94494, FT-73594]
11  04/09/2019            5                               [FT-33266, FT-16693]
12  02/09/2019            4           [FT-13853, FT-18858, FT-62064, FT-58456]
13  04/09/2019            5                               [FT-33266, FT-16693]
14  02/09/2019            4           [FT-13853, FT-18858, FT-62064, FT-58456]
15  05/09/2019            4                                         [FT-69649]

Если нужны строки:

d = df1.groupby('F_Date')['F_Id'].apply(list).to_dict()

df2['new'] = df2.apply(lambda x: ', '.join(d.get(x['F_Date'], [])[:x['num_i_found']]), axis=1)
print (df2)
        F_Date  num_i_found                                               new
0   01/09/2019            5            FT-56832, FT-93828, FT-78590, FT-14296
1   01/09/2019            3                      FT-56832, FT-93828, FT-78590
2   02/09/2019            5  FT-13853, FT-18858, FT-62064, FT-58456, FT-69073
3   02/09/2019            5  FT-13853, FT-18858, FT-62064, FT-58456, FT-69073
4   03/09/2019            3                      FT-19010, FT-94494, FT-73594
5   02/09/2019            4            FT-13853, FT-18858, FT-62064, FT-58456
6   03/09/2019            4            FT-19010, FT-94494, FT-73594, FT-82529
7   03/09/2019            5            FT-19010, FT-94494, FT-73594, FT-82529
8   01/09/2019            5            FT-56832, FT-93828, FT-78590, FT-14296
9   01/09/2019            4            FT-56832, FT-93828, FT-78590, FT-14296
10  03/09/2019            3                      FT-19010, FT-94494, FT-73594
11  04/09/2019            5                                FT-33266, FT-16693
12  02/09/2019            4            FT-13853, FT-18858, FT-62064, FT-58456
13  04/09/2019            5                                FT-33266, FT-16693
14  02/09/2019            4            FT-13853, FT-18858, FT-62064, FT-58456
15  05/09/2019            4                                          FT-69649
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...