从两个相等的列中计算具有不同列的行数

Count number of rows with different columns from two equal columns

我有以下 table,其中有 origin/destination 个城市和额外的城市停靠在始发地-目的地路线上。这是起点奥格斯堡和终点泰尔夫斯的示例。

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

我想从这个table中得到的是不同的现有路线数,即相同停靠城市不重复的路线数。例如在这种情况下它将是 11(因为一行没有任何城市不同于 origin/destination)。 我想像这样构建一个 table:

Origin Destination Number of routes
Augsburg Telfs 11

有什么想法或解决方案吗?

重现数据帧:https://drive.google.com/file/d/1nFLb0yCP24lcbFqqYRt5bq6yttjQNxGh/view?usp=sharing

IIUC:这是一个代码,用于标识有 13 条唯一路由,而不是 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()

这是一个可能的解决方案,列名为 "origin""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)

输出:

origin    destination
Augsburg  Telfs          13
dtype: int64

您的示例数据框仅包含一个这样的组,但如果您有其他 origin-destination 个分组,它们也会显示在输出中。