Python pandas добавляет столбец со значением, сравнивающим столбцы с определенными внешними наборами

#python #pandas #numpy

#питон #pandas #numpy

Вопрос:

У меня есть dataframe (~ 30 000 строк) количество поездок по коду станции.

станция из станция для количество
20001 20040 55
20040 20001 67
20007 20080 100
20080 20007 50

и dataset — идентификатор маршрута: список идентификаторов станций. Пример 10001 (20001,2020,20013, … 20040); 10002 (20007,2000,20019, … 20080). Таких маршрутов около 100. Задача состоит в том, чтобы получить добавить имя маршрута в dataframe в соответствии с критерием, включена ли станция отправления и назначения в тот или иной набор

станция из станция для количество маршрут
20001 20040 55 1001
20040 20001 67 1001
20007 20080 100 1002
20080 20007 50 1002

В основной форме список маршрутов представляет собой XML-файл (элемент с идентификатором Sation id C1, идентификатор маршрута NM), я могу его проанализировать, но я не знаю, в какую форму его преобразовать (dataframe, dict) и что делать дальше

 <?xml version="1.0" encoding="windows-1251"?><MRS1>
<MR NM="002001" PT="0">
<C N="001" C1="2040484" L="000" NZ="099" PZ="0000" NO="01" S="ВЕР УФАЛЕЙ  " ZT="0" />
<C N="002" C1="2040751" L="006" NZ="099" PZ="0000" NO="01" S="ОП 100 КМ   " ZT="0" />
...
<C N="022" C1="2030055" L="106" NZ="099" PZ="0000" NO="07" S="ШАРТАШ      " ZT="0" />
<C N="023" C1="2031190" L="108" NZ="099" PZ="0000" NO="07" S="ПЕРВОМАЙСК  " ZT="0" />
<C N="024" C1="2030000" L="110" NZ="099" PZ="0000" NO="07" S="ЕКАТЕРИНБ П " ZT="0" />
</MR>
<MR NM="002002" PT="0">
<C N="001" C1="2040000" L="000" NZ="099" PZ="0000" NO="01" S="ЧЕЛЯБИНСК   " ZT="0" />
<C N="002" C1="2041748" L="002" NZ="099" PZ="0000" NO="01" S="ЛОКОМОТИВ1  " ZT="0" />
...
<C N="044" C1="2041502" L="152" NZ="099" PZ="0000" NO="01" S="ОП 1948 КМ  " ZT="0" />
<C N="045" C1="2040550" L="160" NZ="099" PZ="0000" NO="01" S="ЗЛАТОУСТ    " ZT="0" />
</MR>
<MRS1>
 

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

1. Как хранятся маршруты? Как dict? пожалуйста, покажите образец отображения маршрута до станции.

2. Есть ли перекрытия в маршрутах? если да, то как вы хотите с ними справиться?

3. Да, в маршрутах могут быть совпадения, но я избавлюсь от них, прежде чем сравнивать, или просто поищу первое встречающееся

4. Я добавляю образец xml маршрута

Ответ №1:

Допустим, вы анализируете XML и преобразуете его в формат dict, как показано ниже:

 route_id = {1001 : [20001,20040], 1002: [20007,20080]}
 

Затем вы пишете этот фрагмент кода для преобразования в формат, который вы можете использовать позже series.map .

 route_rev = {}
for i,k in zip(route.keys(), route.values()):
    for j in k:
        route_rev[j] = i
print(route_rev)
{20001: 1001, 20040: 1001, 20007: 1002, 20080: 1002}
 

Теперь просто используйте map и сопоставьте код станции из station_from с соответствующим кодом маршрута из route_rev dict.

 df['route'] = df.station_from.map(route_rev)
print(df)
   station_from  station_to  count  route
0         20001       20040     55   1001
1         20040       20001     67   1001
2         20007       20080    100   1002
3         20080       20007     50   1002