首页 > 解决方案 > 在数据框中查找列表的共享成员的最有效方法是什么?

问题描述

专家您好:我正在查看职业自行车内部所谓的“COVID-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']}}

标签: pythonpandasdataframe

解决方案


考虑一个pandas解决方案,通过迁移您的字典,concat然后在其自身上运行自联接(使用 SQL 发言),避免反向重复最终计数的骑手对groupby

数据

# 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

推荐阅读