在数据帧内查找列表共享成员的最有效方法?

2024-10-03 17:28:43 发布

您现在位置:Python中文网/ 问答频道 /正文

专家们好:我正在关注职业自行车赛中所谓的“新冠病毒-19泡沫”——我已经为每个车队编制了一份车手名单,以及他们参加过的每一场比赛的名单。每个车队大约有30名车手,在7月份这项运动重新开始后,已经有几十场比赛了

我现在很难理解如何继续分析数据,或者这种结构是否是正确的方法

我的最终目标是绘制一种维恩图,显示哪些车手在一起比赛最多,每个车队一名,以直观地了解他们是否坚持这些泡沫(例如八名车手进行相同的六场比赛,另一组八名车手进行不同的比赛列表,等等)

如果重复/不合适等,请随时标记,但请举手

对于一个团队,我的数据框架看起来是这样的:

{'Races': {'Alexandre Geniez': ['Paris-Chauny ',
   'Paris-Camembert',
   'Tour Poitou-Charentes en Nouvelle Aquitaine',
   'National Championships France - Road Race',
   'Mont Ventoux Dénivelé Challenge',
   'Faun-Ardèche Classic',
   'Tour des Alpes Maritimes et du Var',
   'Tour de La Provence',
   'Grand Prix Cycliste la Marseillaise'],
  'Alexis Gougeard': ['BinckBank Tour',
   'Paris-Chauny ',
   'Paris-Camembert',
   "Grand Prix d'Isbergues - Pas de Calais",
   'Tour Poitou-Charentes en Nouvelle Aquitaine',
   'Bretagne Classic - Ouest-France',
   'National Championships France - Road Race',
   'Tour du Limousin - Nouvelle Aquitaine',
   'Tour de Pologne',
   'Paris - Nice',
   'Le Samyn',
   'Omloop Het Nieuwsblad Elite',
   'Vuelta a Andalucia Ruta Ciclista Del Sol',
   'Clasica de Almeria',
   'Etoile de Bessèges'],
  'Andrea Vendrame': ["Giro d'Italia",
   'Paris-Camembert',
   'Tirreno-Adriatico',
   'Tour Poitou-Charentes en Nouvelle Aquitaine',
   'Bretagne Classic - Ouest-France',
   'National Championships Italy - Road Race',
   'VOO-Tour de Wallonie',
   'Milano-Sanremo',
   'Milano-Torino',
   'Strade Bianche',
   'UAE Tour',
   'Trofeo Laigueglia',
   'Cadel Evans Great Ocean Road Race',
   'Race Torquay',
   'Santos Tour Down Under'],
  'Anthony Jullien': ['De Brabantse Pijl - La Flèche Brabançonne',
   "Ronde de l'Isard",
   'Mont Ventoux Dénivelé Challenge'],
  'Antoine Raugel': ['Brussels Cycling Classic'],
  'Aurélien Paret-Peintre': ["Giro d'Italia",
   'Skoda-Tour de Luxembourg',
   'Tour du Doubs',
   'National Championships France - Road Race',
   'Critérium du Dauphiné',
   "Tour de l'Ain",
   'Paris - Nice',
   'Royal Bernard Drome Classic',
   'Faun-Ardèche Classic',
   'Tour de La Provence',
   'Etoile de Bessèges'],
  'Axel Domont': ['Paris-Chauny ',
   'Tirreno-Adriatico',
   'Tour du Limousin - Nouvelle Aquitaine',
   'Il Lombardia',
   'Tour de Pologne',
   'Race Torquay',
   'Santos Tour Down Under'],
  'Ben Gastauer': ["Giro d'Italia",
   'World Championships - Road Race',
   'Skoda-Tour de Luxembourg',
   'Tour du Doubs',
   'National Championships Luxembourg - Road Race',
   'Tour du Limousin - Nouvelle Aquitaine',
   'National Championships Luxembourg - ITT',
   'Il Lombardia',
   'Tour de Pologne',
   'Royal Bernard Drome Classic',
   'Faun-Ardèche Classic',
   'Tour des Alpes Maritimes et du Var',
   'Trofeo Laigueglia',
   'Cadel Evans Great Ocean Road Race',
   'Race Torquay',
   'Santos Tour Down Under'],
  'Benoît Cosnefroy': ['De Brabantse Pijl - La Flèche Brabançonne',
   'Liège-Bastogne-Liège',
   'La Flèche Wallonne',
   'Tour de France',
   'European Continental Championships - Road Race',
   'National Championships France - Road Race',
   'Critérium du Dauphiné',
   "La Route d'Occitanie - La Dépêche du Midi",
   'Paris - Nice',
   'Royal Bernard Drome Classic',
   'Faun-Ardèche Classic',
   'Tour des Alpes Maritimes et du Var',
   'Etoile de Bessèges',
   'Grand Prix Cycliste la Marseillaise'],
  'Clément Champoussin': ['De Brabantse Pijl - La Flèche Brabançonne',
   'Liège-Bastogne-Liège',
   'La Flèche Wallonne',
   'Paris-Chauny ',
   'Skoda-Tour de Luxembourg',
   'Tour du Doubs',
   'Il Lombardia',
   "Tour de l'Ain"],
  'Clément Chevrier': ['De Brabantse Pijl - La Flèche Brabançonne',
   'Paris-Chauny ',
   'Paris-Camembert',
   'Tour du Doubs',
   'National Championships France - Road Race',
   'Tour du Limousin - Nouvelle Aquitaine',
   'Mont Ventoux Dénivelé Challenge',
   'UAE Tour',
   'Trofeo Laigueglia',
   'Cadel Evans Great Ocean Road Race',
   'Race Torquay',
   'Santos Tour Down Under'],
  'Clément Venturini': ['BinckBank Tour',
   'Tour de France',
   'National Championships France - Road Race',
   'VOO-Tour de Wallonie',
   "La Route d'Occitanie - La Dépêche du Midi",
   'Le Samyn',
   'Kuurne-Bruxelles-Kuurne',
   'Omloop Het Nieuwsblad Elite',
   'Vuelta a Andalucia Ruta Ciclista Del Sol',
   'Clasica de Almeria',
   'Etoile de Bessèges',
   'Grand Prix Cycliste la Marseillaise'],
  'Dorian Godon': ['De Brabantse Pijl - La Flèche Brabançonne',
   'Liège-Bastogne-Liège',
   'La Flèche Wallonne',
   'Paris-Camembert',
   "Grand Prix d'Isbergues - Pas de Calais",
   'Tour Poitou-Charentes en Nouvelle Aquitaine',
   'Bretagne Classic - Ouest-France',
   'National Championships France - Road Race',
   'National Championships France - ITT',
   'Tour de Pologne',
   'Strade Bianche',
   'Le Samyn',
   'Kuurne-Bruxelles-Kuurne',
   'Omloop Het Nieuwsblad Elite',
   'Tour des Alpes Maritimes et du Var',
   'Trofeo Laigueglia',
   'Volta a la Comunitat Valenciana'],
  'François Bidard': ["Giro d'Italia",
   'Paris-Camembert',
   'Skoda-Tour de Luxembourg',
   'Tour Poitou-Charentes en Nouvelle Aquitaine',
   'National Championships France - Road Race',
   'Tour du Limousin - Nouvelle Aquitaine',
   'UAE Tour',
   'Tour de La Provence',
   'Etoile de Bessèges',
   'Grand Prix Cycliste la Marseillaise'],
  'Geoffrey Bouchard': ["Giro d'Italia",
   'Tirreno-Adriatico',
   'Tour du Limousin - Nouvelle Aquitaine',
   'Il Lombardia',
   'Tour de Pologne',
   'UAE Tour',
   'Trofeo Laigueglia',
   'Cadel Evans Great Ocean Road Race',
   'Race Torquay',
   'Santos Tour Down Under'],
  'Harry Tanfield': ["Grand Prix d'Isbergues - Pas de Calais",
   'Tour Poitou-Charentes en Nouvelle Aquitaine',
   'Tour de Pologne',
   'Le Samyn',
   'Grand Prix Cycliste la Marseillaise'],
  'Jaakko Hänninen': ["Giro d'Italia",
   'Tirreno-Adriatico',
   'Il Lombardia',
   "Tour de l'Ain",
   'UAE Tour',
   'Tour de La Provence'],
  'Julien Duval': ['BinckBank Tour',
   'Paris-Camembert',
   "Grand Prix d'Isbergues - Pas de Calais",
   'Brussels Cycling Classic',
   'European Continental Championships - Mixed Relay TTT',
   'Bretagne Classic - Ouest-France',
   'National Championships France - Road Race',
   'VOO-Tour de Wallonie',
   'Milano-Sanremo',
   'Milano-Torino',
   'Strade Bianche',
   'Le Samyn',
   'Kuurne-Bruxelles-Kuurne',
   'Omloop Het Nieuwsblad Elite',
   'Tour de La Provence',
   'Volta a la Comunitat Valenciana'],
  'Lawrence Naesen': ['BinckBank Tour',
   'National Championships Belgium - Road Race',
   'Skoda-Tour de Luxembourg',
   'Brussels Cycling Classic',
   'Bretagne Classic - Ouest-France',
   'VOO-Tour de Wallonie',
   'Milano-Sanremo',
   'Milano-Torino',
   'Strade Bianche',
   'Le Samyn',
   'Kuurne-Bruxelles-Kuurne',
   'Omloop Het Nieuwsblad Elite',
   'Vuelta a Andalucia Ruta Ciclista Del Sol',
   'Clasica de Almeria',
   'Volta a la Comunitat Valenciana'],
  'Mathias Frank': ['De Brabantse Pijl - La Flèche Brabançonne',
   'Liège-Bastogne-Liège',
   'La Flèche Wallonne',
   'Tirreno-Adriatico',
   'Il Lombardia',
   "Tour de l'Ain",
   'Royal Bernard Drome Classic',
   'Faun-Ardèche Classic',
   'Volta a la Comunitat Valenciana'],
  'Mikaël Cherel': ['Liège-Bastogne-Liège',
   'La Flèche Wallonne',
   'Tour de France',
   'National Championships France - Road Race',
   'Critérium du Dauphiné',
   'Mont Ventoux Dénivelé Challenge',
   "La Route d'Occitanie - La Dépêche du Midi",
   'Paris - Nice',
   'Faun-Ardèche Classic',
   'Tour des Alpes Maritimes et du Var',
   'Tour de La Provence',
   'Grand Prix Cycliste la Marseillaise'],
  'Nans Peters': ['World Championships - Road Race',
   'Tour de France',
   'National Championships France - Road Race',
   'Critérium du Dauphiné',
   "Tour de l'Ain",
   'Paris - Nice',
   'Royal Bernard Drome Classic',
   'Faun-Ardèche Classic',
   'Tour des Alpes Maritimes et du Var',
   'Tour de La Provence'],
  'Oliver Naesen': ['BinckBank Tour',
   'World Championships - Road Race',
   'National Championships Belgium - Road Race',
   'Tour de France',
   'European Continental Championships - Road Race',
   'VOO-Tour de Wallonie',
   'Milano-Sanremo',
   'Milano-Torino',
   'Strade Bianche',
   'Paris - Nice',
   'Kuurne-Bruxelles-Kuurne',
   'Omloop Het Nieuwsblad Elite',
   'Vuelta a Andalucia Ruta Ciclista Del Sol',
   'Clasica de Almeria',
   'Volta a la Comunitat Valenciana'],
  'Pierre Latour': ['Tour de France',
   'National Championships France - Road Race',
   'Critérium du Dauphiné',
   'Mont Ventoux Dénivelé Challenge',
   "La Route d'Occitanie - La Dépêche du Midi",
   'Paris - Nice',
   'Royal Bernard Drome Classic',
   'Etoile de Bessèges'],
  'Quentin Jauregui': ['Liège-Bastogne-Liège',
   'La Flèche Wallonne',
   'Paris-Chauny ',
   "Grand Prix d'Isbergues - Pas de Calais",
   'Tour du Doubs',
   'Brussels Cycling Classic',
   'Bretagne Classic - Ouest-France',
   'National Championships France - Road Race',
   'Tour du Limousin - Nouvelle Aquitaine',
   'Tour de Pologne',
   'UAE Tour',
   'Etoile de Bessèges',
   'Grand Prix Cycliste la Marseillaise'],
  'Romain Bardet': ['De Brabantse Pijl - La Flèche Brabançonne',
   'Tour de France',
   'National Championships France - Road Race',
   'Critérium du Dauphiné',
   "La Route d'Occitanie - La Dépêche du Midi",
   'Paris - Nice',
   'Royal Bernard Drome Classic',
   'Tour des Alpes Maritimes et du Var',
   'Santos Tour Down Under'],
  'Silvan Dillier': ['BinckBank Tour',
   'World Championships - Road Race',
   'Tirreno-Adriatico',
   'Tour Poitou-Charentes en Nouvelle Aquitaine',
   'VOO-Tour de Wallonie',
   'National Championships Switzerland - ITT',
   'Kuurne-Bruxelles-Kuurne',
   'Omloop Het Nieuwsblad Elite',
   'Vuelta a Andalucia Ruta Ciclista Del Sol',
   'Clasica de Almeria'],
  'Simon Verger': ["Grand Prix d'Isbergues - Pas de Calais",
   'National Championships France - ITT'],
  'Stijn Vandenbergh': ['BinckBank Tour',
   'Paris-Chauny ',
   'National Championships Belgium - Road Race',
   "Grand Prix d'Isbergues - Pas de Calais",
   'Brussels Cycling Classic',
   'Bretagne Classic - Ouest-France',
   'VOO-Tour de Wallonie',
   'Milano-Sanremo',
   'Milano-Torino',
   'Vuelta a Andalucia Ruta Ciclista Del Sol',
   'Clasica de Almeria',
   'Volta a la Comunitat Valenciana'],
  'Tony Gallopin': ["Giro d'Italia",
   'Skoda-Tour de Luxembourg',
   'Tour du Doubs',
   'National Championships France - Road Race',
   'Critérium du Dauphiné',
   'Mont Ventoux Dénivelé Challenge',
   "La Route d'Occitanie - La Dépêche du Midi",
   'Volta a la Comunitat Valenciana']}}

Tags: dechelaclassicgrandduparisrace
3条回答

如果您想知道每位骑手一起骑行的时间:

teams_diagram = {}

for team in teams.keys():
    teams_diagram[team] = {}
    for rider in teams.get(team).get('Races').keys():
        teams_diagram[team][rider] = {}
        for rider2 in teams.get(team).get('Races').keys():
            if rider2 != rider:
                teams_diagram[team][rider][rider2] = 0
                for ride in teams.get(team).get('Races').get(rider):
                    if ride in teams.get(team).get('Races').get(rider2):
                        teams_diagram[team][rider][rider2] += 1

print(teams_diagram)

这将为每个骑手以及他与其他骑手的骑行次数创造一个词汇。您可以将其用于多个团队(不要忘了将其存储在词汇表中) 在您的示例中:

teams = {"Team 1" :{'Races': {'Alexandre Geniez': ['Paris-Chauny ',
   'Paris-Camembert',
   'Tour Poitou-Charentes en Nouvelle Aquitaine',
   'National Championships France - Road Race',
   'Mont Ventoux Dénivelé Challenge',
   'Faun-Ardèche Classic',
   'Tour des Alpes Maritimes et du Var',
   ....
   ....
   ....
  'Tony Gallopin': ["Giro d'Italia",
   'Skoda-Tour de Luxembourg',
   'Tour du Doubs',
   'National Championships France - Road Race',
   'Critérium du Dauphiné',
   'Mont Ventoux Dénivelé Challenge',
   "La Route d'Occitanie - La Dépêche du Midi",
   'Volta a la Comunitat Valenciana']}}}

考虑将{{CD1>}解决方案迁移为^ {< CD2>},然后在其自身上运行一个自连接(使用SQL语句),避免反向重复,最终对游戏者对计数为^ {CD3>}:

数据

# BUILD DATA FRAME FROM DICTIONARY
riders_df = pd.concat([pd.DataFrame({'rider': k, 'race': r}) for k, r in data['Races'].items()],
                      ignore_index=True)

riders_df.head()
#               rider                                         race
# 0  Alexandre Geniez                                 Paris-Chauny
# 1  Alexandre Geniez                              Paris-Camembert
# 2  Alexandre Geniez  Tour Poitou-Charentes en Nouvelle Aquitaine
# 3  Alexandre Geniez    National Championships France - Road Race
# 4  Alexandre Geniez              Mont Ventoux Dénivelé Challenge

riders_df.tail()
#              rider                                       race
# 305  Tony Gallopin  National Championships France - Road Race
# 306  Tony Gallopin                      Critérium du Dauphiné
# 307  Tony Gallopin            Mont Ventoux Dénivelé Challenge
# 308  Tony Gallopin  La Route d'Occitanie - La Dépêche du Midi
# 309  Tony Gallopin            Volta a la Comunitat Valenciana

自连接

# MERGE ON ITSELF AND AVOID REVERSE DUPLICATES
match_races_df = (pd.merge(riders_df, riders_df, how='inner', on='race', suffixes = ['', '_'])
                    .query("rider > rider_")
                 )

match_races_df.head()
#                   rider           race            rider_
# 7       Alexis Gougeard  Paris-Chauny   Alexandre Geniez
# 14          Axel Domont  Paris-Chauny   Alexandre Geniez
# 15          Axel Domont  Paris-Chauny    Alexis Gougeard
# 21  Clément Champoussin  Paris-Chauny   Alexandre Geniez
# 22  Clément Champoussin  Paris-Chauny    Alexis Gougeard

match_races_df.tail()
#                   rider                                        race             rider_
# 2038      Tony Gallopin             Volta a la Comunitat Valenciana      Oliver Naesen
# 2039      Tony Gallopin             Volta a la Comunitat Valenciana  Stijn Vandenbergh
# 2045      Oliver Naesen  National Championships Belgium - Road Race    Lawrence Naesen
# 2048  Stijn Vandenbergh  National Championships Belgium - Road Race    Lawrence Naesen
# 2049  Stijn Vandenbergh  National Championships Belgium - Road Race      Oliver Naesen

聚合

# AGGREGATE DATA BY RIDER PAIRS                    
agg_df = match_races_df.groupby(['rider', 'rider_'], as_index=False)['race'].count()

# SHOW RIDERS WITH SEVEN OR MORE SHARED RACES
agg_df.loc[agg_df['race'] >= 7]
#                  rider                  rider_  race
# 37   Clément Venturini         Alexis Gougeard     7
# 43        Dorian Godon         Alexis Gougeard     8
# 65   Geoffrey Bouchard         Andrea Vendrame     7
# 68   Geoffrey Bouchard            Ben Gastauer     8
# 93        Julien Duval         Alexis Gougeard     7
# 100       Julien Duval            Dorian Godon     9
# 110    Lawrence Naesen       Clément Venturini     7
# 114    Lawrence Naesen            Julien Duval    11
# 134      Mikaël Cherel        Benoît Cosnefroy    10
# 146        Nans Peters  Aurélien Paret-Peintre     7
# 148        Nans Peters        Benoît Cosnefroy     7
# 157        Nans Peters           Mikaël Cherel     7
# 163      Oliver Naesen       Clément Venturini     7
# 165      Oliver Naesen            Julien Duval     8
# 166      Oliver Naesen         Lawrence Naesen    11
# 175      Pierre Latour        Benoît Cosnefroy     7
# 186   Quentin Jauregui         Alexis Gougeard     7
# 214      Romain Bardet        Benoît Cosnefroy     8
# 243     Silvan Dillier           Oliver Naesen     7
# 259  Stijn Vandenbergh            Julien Duval     8
# 260  Stijn Vandenbergh         Lawrence Naesen    10
# 262  Stijn Vandenbergh           Oliver Naesen     8

我建议创建一个新的结构,它是一个将事件名称映射到参与者的字典:

racers = data['Races']

from collections import defaultdict

events = defaultdict(list)
for name, events_done in racers.items():
    for event in events_done:
        events[event].append(name)

然后,您可以创建一个新结构,它是一个字典,将每个骑自行车的人映射到一个字典,该字典将每个骑自行车的人映射到他们与他们比赛的次数:

venn = defaultdict(lambda: defaultdict(int))
for bikers in events.values():
    for b1 in bikers:
        for b2 in bikers:
            if b1 != b2:
                venn[b1][b2] += 1

(这段代码不是最好的,只是我很快想到的)

这导致了类似这样的情况:

>>> venn['Alexandre Geniez']
defaultdict(<class 'int'>, {
'Alexis Gougeard': 4, 'Axel Domont': 1, 'Clément Champoussin': 1, 
'Clément Chevrier': 4, 'Quentin Jauregui': 3, 'Stijn Vandenbergh': 1, 
'Andrea Vendrame': 2, 'Dorian Godon': 4, 'François Bidard': 5, 'Julien Duval': 3, 
'Harry Tanfield': 2, 'Silvan Dillier': 1, 'Aurélien Paret-Peintre': 3, 
'Benoît Cosnefroy': 4, 'Clément Venturini': 2, 'Mikaël Cherel': 6, 
'Nans Peters': 4, 'Pierre Latour': 2, 'Romain Bardet': 2, 
'Tony Gallopin': 2, 'Anthony Jullien': 1, 'Ben Gastauer': 2, 
'Mathias Frank': 1, 'Jaakko Hänninen': 1})

我想这会让你走上正轨

相关问题 更多 >