【问题标题】:KeyError when trying to access a newly assigned column in a pandas dataframe尝试访问熊猫数据框中新分配的列时出现 KeyError
【发布时间】:2018-02-05 08:02:25
【问题描述】:

KeyError 帖子上的解决方案都没有解决我的问题,因此这个问题:

我在 Pandas DataFrame 中有以下列:

df['EventDate']

0        26-12-2016
1        23-12-2016
2        16-12-2016
3        15-12-2016
4        11-12-2016
5        10-12-2016
6        07-12-2016

现在我正在尝试使用以下命令拆分日期并将年份的最后四个值提取到另一个系列中:

trial=df["EventDate"].str.split("-",2,expand=True)

现在使用第三个索引值,我可以获得整个值:

df.year=trial[2]

现在检查年份列的数据类型:

type(df.year)
Out[80]: pandas.core.series.Series

是的,它是通过试用[2] 代码转移到 df.year 的 Pandas 系列

print(trial[2])
0        2016
1        2016
2        2016
3        2016
4        2016

现在我正在尝试按年份列分组,这就是我得到错误的地方:

yearwise=df.groupby('year')

Traceback (most recent call last):

File "<ipython-input-81-cf39b80933c4>", line 1, in <module>
yearwise=df.groupby('year')

File "C:\WINPYTH\python-3.5.4.amd64\lib\site-
packages\pandas\core\generic.py", line 4416, in groupby
**kwargs)

 File "C:\WINPYTH\python-3.5.4.amd64\lib\site-
 packages\pandas\core\groupby.py", line 1699, in groupby
 return klass(obj, by, **kwds)

File "C:\WINPYTH\python-3.5.4.amd64\lib\site-
packages\pandas\core\groupby.py", line 392, in __init__
mutated=self.mutated)

File "C:\WINPYTH\python-3.5.4.amd64\lib\site-
packages\pandas\core\groupby.py", line 2690, in _get_grouper
raise KeyError(gpr)

KeyError: 'year'

您能帮忙解决这个 KeyError 并获取 Year 列的 Groupby 值吗?

在此先感谢您的回答。

【问题讨论】:

  • 您能否发布 df.columns 的输出并仔细检查是否缺少空格或其他内容?

标签: python pandas dataframe keyerror


【解决方案1】:

这里的根本误解是你认为做

df.year = ...

df 中创建一个名为year 的列,但这是不是正确的!观察:

print(df)

         Col1
0  26-12-2016
1  23-12-2016
2  16-12-2016
3  15-12-2016
4  11-12-2016
5  10-12-2016
6  07-12-2016

df.year = df.Col1.str.split('-', 2, expand=True)[2]

print(type(df.year))
pandas.core.series.Series

print(df) # where's 'year'??

         Col1
0  26-12-2016
1  23-12-2016
2  16-12-2016
3  15-12-2016
4  11-12-2016
5  10-12-2016
6  07-12-2016

那么,df.year 是什么?它是df属性,与列不同。在 python 中,您可以使用 dot 表示法分配属性,因此这可以正常工作而不会引发错误。你可以打印出df.__dict__来确认:

print(df.__dict__)

{ ...
 'year': 0    2016
 1    2016
 2    2016
 3    2016
 4    2016
 5    2016
 6    2016
 Name: 2, dtype: object}

如果您想实际分配给列,则需要使用[...] 索引语法,如下所示:

df['year'] = df.Col1.str.split('-', 2, expand=True)[2]
print(df)

         Col1  year
0  26-12-2016  2016
1  23-12-2016  2016
2  16-12-2016  2016
3  15-12-2016  2016
4  11-12-2016  2016
5  10-12-2016  2016
6  07-12-2016  2016

【讨论】:

  • @jezrael 有趣的是,点表示法仅在列存在时有效,否则无效。它可能与 pandas __getattr____hasattr__ 实现有关。
猜你喜欢
  • 2021-09-17
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2018-07-27
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多