Найти соответствие сроки из одного датафрейма с графой по нескольким строкам другого датафрейма
Дана задача найти соответствие оплаты накладных в графе DocN df1 с данными графе TXT в df2. Вывести на печать накладную (DocN) + сумму(DocSum) и реквизиты соответствующей ей оплаты (DocP, Date)
import pandas as pd
import numpy as np
import re
data1 = {
"DocN": ['140111038-001', '7314560', '169233301-001','ЕКТ01886853','ЕКТ02126350','30262-19',
'27283-19','746'],
"DocSum": ['358,80', '1487,45', '7458,78','2478,12','9624,95','3247,32',
'3224,25','32587,22'],
}
df1 = pd.DataFrame(data1)
data2 = {
"TXT": ['Оплата за товар по сч-ф 30262-19, 30317-19, 30329-19, 31270-19, 32038-19, 26713-19,
26715-19, ', 'Оплата за товар по сч-ф 26721-19, 26748-19, 29835-19, 31112-19, 26746-19, 30041-
19, 23150-19, ', 'Оплата за товар по сч-ф 23525-19, 25050-19, 26244-19, 27997-19, 28032-19,
30278-19, ЕКТ01886853','Оплата за товар по сч-ф 29227-19, 29713-19, 27283-19, 32003-19, 29235-
19, 29888-19, 7314560','Оплата за товар по сч-ф 175634096-001, 175634109-001, 175623281-001,
175638863-001, 140111038-001'],
"DocP": [112, 113, 114, 115, 116],
"Date": ["25.01.2022", "26.01.2022", "27.01.2022", "28.01.2022", "29.01.2022"]
}
df2 = pd.DataFrame(data2)
print(df1)
print(df2)
я очистил данные в df2
for i in range(0,len(df2)):
txt_list = df2.loc[i,'TXT'].replace(",","").split()
print(txt_list)
далее планировал создать вложенный цикл, который бы брал номер накладной и сличал со списком txt_list по каждой строке последовательно
for i in range(0,len(df2)):
txt_list = df2.loc[i,'TXT'].replace(",","").split()
for m in df1['DocN']:
if m in txt_list:
но данные формируются некорректно
Ответы (1 шт):
Автор решения: SergFSM
→ Ссылка
могу такой вариант предложить:
df1.join(df1.DocN.apply(
lambda x: pd.Series(df2.loc[df2['TXT'].str.contains(fr'\b{x}\b'),['DocP','Date']]
.to_dict('list'))))
>>>
'''
DocN DocSum DocP Date
0 140111038-001 358,80 [112, 116] [25.01.2022, 29.01.2022] <--- немного изменил data2 для тестирования
1 7314560 1487,45 [115] [28.01.2022]
2 169233301-001 7458,78 [] []
3 ЕКТ01886853 2478,12 [114] [27.01.2022]
4 ЕКТ02126350 9624,95 [] []
5 30262-19 3247,32 [112] [25.01.2022]
6 27283-19 3224,25 [115] [28.01.2022]
7 746 32587,22 [] []