从两个相等的列中计算具有不同列的行数
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 个分组,它们也会显示在输出中。
我有以下 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 个分组,它们也会显示在输出中。