python Pandas - Key Error when key clearly exists in dataframe

dgtucam1  于 2023-09-29  发布在  Python
关注(0)|答案(3)|浏览(97)

我有一个函数,我试图应用到一个 Dataframe '球员'。
'players'使用.groupby()从更大的 Dataframe 'df_tot'中获取:

players = df_tot.groupby(["Player", "Year"]).get_group(("Derrick White", 2022))

players返回以下dataframe:
| | RK|球员|POS|年龄|TM| G| GS| MP|年| Year |
| --|--|--|--|--|--|--|--|--|--|--|
| 17263 | 776 | 578 |德里克·白色|SG| 27 |TOT| 75 | 52 | 2199 | 2022 |
| 17264 | 777 | 578 |德里克·白色|SG| 27 |SAS| 49 | 48 | 1486 | 2022 |
| 17265 | 778 | 578 |德里克·白色|SG| 27 |BOS| 26 | 4 | 713 | 2022 |
我想返回'Tm' = 'TOT'的行。
以下是我尝试应用于“玩家”的函数:

def clean_traded(df):
    if df.shape[0]==1:
        return df
    else:
        row = df[df["Tm"]=="TOT"]
        row["Tm"] = df.iloc[-1,:]["Tm"]
        return row

players.apply(clean_traded)

然而,我收到:

KeyError: 'Tm'

当'Tm'显然是'players' Dataframe 中的一列时,这是怎么可能的呢?例如下面的代码:

print(players.columns.tolist())

回报率:

['Unnamed: 0', 'Rk', 'Player', 'Pos', 'Age', 'Tm', 'G', 'GS', 'MP', 'Year']

下面的代码不会产生错误,但是我想知道为什么添加“get_group”会产生错误。

players = df_tot.groupby(["Player", "Year"]).apply(clean_traded)

谢谢你,谢谢!

xqnpmsa8

xqnpmsa81#

我不确定你的目标是什么,你写这个函数并应用它,而不是像这样用你的条件过滤行,有什么原因吗?

res = players.loc[players['Tm']=='TOT',:]

print(res)
       Unnamed: 0   Rk         Player Pos  Age   Tm   G  GS    MP  Year
17263         776  578  Derrick White  SG   27  TOT  75  52  2199  2022

如果你想调试你的函数或者更好地理解那里发生了什么,只需要在里面放一些print语句。例如,print(players)位于else语句的开头。然后你会明白为什么你得到一个KeyError

qv7cva1a

qv7cva1a2#

默认情况下,apply应用于列。当它被应用时,列被转换为系列。因此,当您执行players.apply(clean_traded)时,它首先查看Unnamed: 0,将其转换为Series,然后尝试将clean_traded应用于该Series。此Series将行名称作为标签,但列名'Unnamed: 0'不是Series的一部分。因此,这将返回一个错误,因为Series中没有Tm列。
你应该只做clean_traded(players)。几乎可以肯定的是,有一种更简单的方法可以完成你要做的事情。

dzhpxtsq

dzhpxtsq3#

这可能适用于也可能不适用于您的情况,但我过去曾被列名中的尾随空格所愚弄。
调用df.columns将列出带引号的列名,这样您就可以看到不可见的前导或尾随空格字符(如果存在)。

相关问题