I have the following table, which has origin/destination cities and extra cities that are stops on the origin-destination route. This is an example for origin Augsburg and destinationn Telfs.
origin | destination | city | city.1 | city.2 | city.3 | city.4 | city.5 | city.6 | city.7 | city.8 | city.9 | city.10 | city.11 | city.12 | city.13 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | |||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | |||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | |||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | |||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | Hermagor | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | |||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | Hermagor | Aichdorf | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | Hermagor | Aichdorf | Ilshofen | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | |
Augsburg | Telfs | Augsburg | Telfs | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ||||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | Hermagor | Aichdorf | Ilshofen | Reutte | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | |||||||||||||||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | |||||||||||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | ||||||||||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | Hermagor | |||||||||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | Hermagor | Aichdorf | ||||||||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | Hermagor | Aichdorf | Ilshofen | |||||||||||||||
Augsburg | Telfs | Augsburg | Telfs | Löffingen | Todtmoos | Remseck | Heilbronn | Ottersweier | Imst | Feldkirchen | Wien | Hermagor | Aichdorf | Ilshofen |
What I want from this table is to obtain the number of different existing routes, that is, the number of routes where the same stopping cities are not repeated. For example in this case it would be 11 (because one row doesnt have any city different to the origin/destination). I want to build a table like this:
Origin | Destination | Number of routes |
---|---|---|
Augsburg | Telfs | 11 |
any idea or solution?
to reproduce dataframe : https://drive.google.com/file/d/1nFLb0yCP24lcbFqqYRt5bq6yttjQNxGh/view?usp=sharing
CodePudding user response:
IIUC: Here is a code that identifies there are 13 unique routes not 11.
import pandas as pd
df = pd.read_clipboard()
df = df[[x for x in df.columns if not 'Unnamed' in x]]
df = df.assign(hash=df.apply(lambda x: hash("".join(x.fillna("")[1:])), axis=1))
df.groupby(["origin", "destination", "hash"])["city"].count().count()
CodePudding user response:
Here is one potential solution, with columns named "origin"
and "destination"
:
def get_start_and_end(row):
return row[row.last_valid_index()]
def get_number_of_unique_routes_by_group(group):
return len(group.apply(get_start_and_end, axis=1).unique())
df.groupby(["origin", "destination"]).apply(get_number_of_unique_routes_by_group)
Output:
origin destination
Augsburg Telfs 13
dtype: int64
Your example dataframe only included one such group, but if you had other origin-destination groupings, they'd show up in the output too.