我有一个函数,我试图应用到一个 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)
谢谢你,谢谢!
3条答案
按热度按时间xqnpmsa81#
我不确定你的目标是什么,你写这个函数并应用它,而不是像这样用你的条件过滤行,有什么原因吗?
如果你想调试你的函数或者更好地理解那里发生了什么,只需要在里面放一些print语句。例如,
print(players)
位于else
语句的开头。然后你会明白为什么你得到一个KeyError
。qv7cva1a2#
默认情况下,
apply
应用于列。当它被应用时,列被转换为系列。因此,当您执行players.apply(clean_traded)
时,它首先查看Unnamed: 0
,将其转换为Series,然后尝试将clean_traded
应用于该Series。此Series将行名称作为标签,但列名'Unnamed: 0'
不是Series的一部分。因此,这将返回一个错误,因为Series中没有Tm
列。你应该只做
clean_traded(players)
。几乎可以肯定的是,有一种更简单的方法可以完成你要做的事情。dzhpxtsq3#
这可能适用于也可能不适用于您的情况,但我过去曾被列名中的尾随空格所愚弄。
调用
df.columns
将列出带引号的列名,这样您就可以看到不可见的前导或尾随空格字符(如果存在)。