繁体   English   中英

如何根据 Python 中字典中的键添加 pandas 列值?

[英]How to add pandas column values based on key from a dictionary in Python?

我的 dataframe 看起来像这样: 姓名

我想为每一行添加俱乐部参加的联赛以及联赛所在的国家/地区作为新列。

我最初尝试使用俱乐部/国家/地区的字典,并返回一个值的键:

club_country_dict = {'La Liga':['Real Madrid','FC Barcelona'],'France Ligue 1':['Paris Saint-Germain']}

key_list=list(club_country_dict.keys())
val_list=list(club_country_dict.values())

但这遇到了问题,因为我的每个键值实际上都是一个列表,而不是单个值。

然后我尝试了一些 IF THEN 逻辑,通过为每个联赛设置独立变量,并检查俱乐部值是否在每个变量中:

la_Liga = ['Real Madrid','FC Barcelona']

for row in data:
      if data['Club'] in la_Liga:
            data['League'] = 'La Liga'

为这个混乱的问题道歉。 基本上,我希望根据“俱乐部”列值向我的数据集“联盟”和“国家/地区”添加两个新列。 我不确定最简单的方法是什么,但我尝试过不同的方法。 提前致谢。

您可以将字典转换为数据框,然后合并:

df = pd.DataFrame({"Name": ["CR", "Messi", "neymar"], "Club": ["Real Madrid", "FC Barcelona", "Paris Saint-Germain"]})

df.merge(pd.DataFrame(club_country_dict.items(), columns=['League', 'Club']).explode('Club'),
         on = 'Club', how='left')

在此处输入图像描述

这是解决它的简单方法之一。 使用 Pandas 在行 https 上应用function://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html

import pandas as pd

df = pd.DataFrame({"name": ["CR", "Messi", "neymar"], "club": ["RM", "BR", "PSG"]})

country = {"BR": "Spain", "PSG": "France", "RM": "Spain"}

df["country"] = df.apply(lambda row: country[row.club], axis=1)

print(df)

Output:

     name club country
0      CR   RM   Spain
1   Messi   BR   Spain
2  neymar  PSG  France

尝试 pandas replace系列的功能。

df = pd.DataFrame({"Name" : ['Cristiano', 'L. Messi', "Neymar"], 'Club' : ["Real Madrid", "FC Barcelona", "Paris Saint-Germain"]})

df:

    Name        Club
0   Cristiano   Real Madrid
1   L. Messi    FC Barcelona
2   Neymar      Paris Saint-Germain

现在添加新列:

club_country_dict = {'Real Madrid': 'La Liga',
                     'FC Barcelona' : "La Liga",
                     'Paris Saint-Germain': 'France Ligue 1'}
df['League'] = df.Club.replace(club_country_dict)

df:

    Name        Club                   League
0   Cristiano   Real Madrid            La Liga
1   L. Messi    FC Barcelona           La Liga
2   Neymar      Paris Saint-Germain    France Ligue 1

为了应对club_country_dict中的“列表问题”,将其转换为以下系列

league_club = pd.Series(club_country_dict.values(), index=club_country_dict.keys(),
    name='Club').explode()

结果是:

La Liga                   Real Madrid
La Liga                  FC Barcelona
France Ligue 1    Paris Saint-Germain
Name: Club, dtype: object

您还应该在联赛名称与其国家(另一个Series )之间建立“联系”:

league_country = pd.Series({'La Liga': 'Spain', 'France Ligue 1': 'France'}, name='Country')

当然,在这里添加与他们的国家感兴趣的其他联盟。

接下来就是将他们加入到club_details DataFrame中,以Club为索引:

club_details = league_club.to_frame().join(league_country).reset_index()\
    .rename(columns={'index':'League'}).set_index('Club')

结果是:

                             League Country
Club                                       
Paris Saint-Germain  France Ligue 1  France
Real Madrid                 La Liga   Spain
FC Barcelona                La Liga   Spain

然后,假设您的第一个 DataFrame 名为player ,生成最终结果:

result = player.join(club_details, on='Club')

结果是:

                Name                 Club          League Country
0  Cristiano Ronaldo          Real Madrid         La Liga   Spain
1           L. Messi         FC Barcelona         La Liga   Spain
2             Neymar  Paris Saint-Germain  France Ligue 1  France

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM