Dataframe добавление столбцов по уcловию
Есть две таблицы
import pandas as pd
df1 = pd.DataFrame({'id':[1234567890, 1234566690, 1235564490, 1235564590, 1234599890, 3333355555],
'name':['Sam', 'Andrea', 'Alex', 'Robin', 'Kia', 'Petr'],
'country':[14, 25, 55, 8, 21, 77]})
df2 = pd.DataFrame({'id_code':[12345, 12345, 12355, 12355, 12345],
'id_start':[67870, 66680, 64489, 64589, 99889],
'id_end':[67990, 66699, 64496, 64595, 99899],
'category':['Kino', 'Film', 'Comedy', 'ttt', 'kkk'],
'title':['retewrt', 'dsfsdfs', 'fsdfsfs', 'fsdewe', 'dfsdfsf']})
print(df2.loc[(df2['id_code'] == int(str(df1['id'][0])[:5])) & (df2['id_start'] <= int(str(df1['id'][0])[5:])) & (df2['id_end'] >= int(str(df1['id'][0])[5:]))])
нужно сделать объединение столбцов по условию id(id делиться на id_code который начинается с первого символа и заканчивается 5-м [:5] и диапазон id_start [5:] id_end[5:]) выбор строки у меня получилось сделать, но как сделать это по всей таблице и добавить эти столбцы, чтоб получилось вот так а если нет id во второй таблице то заполнить NaN:
id name country id_code id_start id_end category title
0 1234567890 Sam 14 12345 67870 67990 Kino retewrt
1 1234566690 Andrea 25 12345 66680 66699 Film dsfsdfs
2 1235564490 Alex 55 12355 64489 64496 Comedy fsdfsfs
3 1235564590 Robin 8 12355 64589 64595 ttt fsdewe
4 1234599890 Kia 21 12345 99889 99899 kkk dfsdfsf
5 3333355555 Petr 77 NaN NaN NaN NaN NaN
Ответы (2 шт):
Автор решения: strawdog
→ Ссылка
Не знаю, насколько верно я понял ваш вопрос, но советовал бы не писать громоздких однострочников, если вы начинаете путаться:
df1["id_code"] = df1["id"]//100000
df1["id_start"] = df1["id"] - df1["id_code"]*100000
res = pd.merge(df1, df2, on=["id_code"], how = "left")
res = res.loc[(res["id_start_y"]<=res["id_start_x"])&(res["id_end"]>=res["id_start_x"])]
res = pd.merge(df1, res, on="name", how="outer").drop(columns=["id_y", "country_y", "id_code_x", "id_start_y"]).rename(columns=lambda x: x.rstrip('_x'))
res:
id name country id_start id_code_y id_start id_end category title
0 1234567890 Sam 14 67890 12345.0 67890.0 67990.0 Kino retewrt
1 1234566690 Andrea 25 66690 12345.0 66690.0 66699.0 Film dsfsdfs
2 1235564490 Alex 55 64490 12355.0 64490.0 64496.0 Comedy fsdfsfs
3 1235564590 Robin 8 64590 12355.0 64590.0 64595.0 ttt fsdewe
4 1234599890 Kia 21 99890 12345.0 99890.0 99899.0 kkk dfsdfsf
5 3333355555 Petr 77 55555 NaN NaN NaN NaN NaN
Автор решения: SergFSM
→ Ссылка
вот такой код вроде работает, попробуйте его потестировать:
indx = pd.IntervalIndex.from_arrays(df2.id_start,df2.id_end)
df2['intrv'] = indx
df1['id_code'] = df1.id//100000
df1['intrv'] = pd.cut(df1.id%100000,indx)
res = df1.dropna().merge(df2).drop(columns = ['intrv'])
print(res)
'''
id name country id_code id_start id_end category title
0 1234567890 Sam 14 12345 67870 67990 Kino retewrt
1 1234566690 Andrea 25 12345 66680 66699 Film dsfsdfs
2 1235564490 Alex 55 12355 64489 64496 Comedy fsdfsfs
3 1235564590 Robin 8 12355 64589 64595 ttt fsdewe
4 1234599890 Kia 21 12345 99889 99899 kkk dfsdfsf