为啥我重命名后无法访问 pandas 中的列? [复制]

Posted

技术标签:

【中文标题】为啥我重命名后无法访问 pandas 中的列? [复制]【英文标题】:Why can't I access a column in pandas after renaming? [duplicate]为什么我重命名后无法访问 pandas 中的列? [复制] 【发布时间】:2017-12-19 14:07:01 【问题描述】:

如果我有一个数据框并重命名该列,我将无法通过其新名称访问该列。

参见示例:

import pandas as pd 
df = pd.DataFrame('a':[1,2], 'b': [10,20])
df
   a   b
0  1  10
1  2  20
df['a']
0    1
1    2

现在,如果我按照here 建议的方式重命名列“a”。

df.columns.values[0] = 'newname'
df
   newname   b
0        1  10
1        2  20

现在让我们尝试使用“新名称”访问该列

 df['newname']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/gpfs0/export/opt/anaconda-2.3.0/lib/python2.7/site-packages/pandas/core/frame.py", line 1797, in __getitem__
    return self._getitem_column(key)
  File "/gpfs0/export/opt/anaconda-2.3.0/lib/python2.7/site-packages/pandas/core/frame.py", line 1804, in _getitem_column
    return self._get_item_cache(key)
  File "/gpfs0/export/opt/anaconda-2.3.0/lib/python2.7/site-packages/pandas/core/generic.py", line 1084, in _get_item_cache
    values = self._data.get(item)
  File "/gpfs0/export/opt/anaconda-2.3.0/lib/python2.7/site-packages/pandas/core/internals.py", line 2851, in get
    loc = self.items.get_loc(item)
  File "/gpfs0/export/opt/anaconda-2.3.0/lib/python2.7/site-packages/pandas/core/index.py", line 1572, in get_loc
    return self._engine.get_loc(_values_from_object(key))
  File "pandas/index.pyx", line 134, in pandas.index.IndexEngine.get_loc (pandas/index.c:3824)
  File "pandas/index.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandas/index.c:3704)
  File "pandas/hashtable.pyx", line 686, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12280)
  File "pandas/hashtable.pyx", line 694, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12231)
KeyError: 'newname'

但我仍然可以使用旧名称访问该列。

df['a']
0    1
1    2
Name: a, dtype: int64

似乎我已经更改了列的名义名称,但该更改并未传播到用于尊重数据框结构中的列的字典。

问题:为什么会发生这种行为,我该如何解决?

【问题讨论】:

【参考方案1】:

您可以使用这种方法:

In [131]: df.columns = ['newname'] + df.columns.tolist()[1:]

In [132]: df
Out[132]:
   newname   b
0        1  10
1        2  20

或:

In [136]: df = df.rename(columns=df.columns.tolist()[0]:'newname')

In [137]: df
Out[137]:
   newname   b
0        1  10
1        2  20

【讨论】:

以上是关于为啥我重命名后无法访问 pandas 中的列? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

根据字典重命名PANDAS中的列

是否可以直接重命名存储在 hdf5 文件中的 pandas 数据框的列?

如何使用字典键和值重命名 pandas DataFrame 中的列?

像普通列一样访问 Pandas 索引

使用 Pandas 重命名 excel 的列

删除pandas数据帧中的重复项后,替换特定的列值