为什么str.replace(在索引上)给出KeyError?

时间:2019-02-17 22:05:06

标签: python pandas

我正在尝试使用以下代码替换“国家/地区名称”中的括号,其中“国家/地区”是DataFrame的索引:

energy['Country'] = energy['Country'].str.replace(r"\s+\(.*\)","")

我在各处都尝试过变体,但是无论如何我都会遇到以下错误:

KeyError                                  Traceback (most recent call last)
/opt/conda/lib/python3.6/site-packages/pandas/indexes/base.py in get_loc(self, key, method, tolerance)
   2133             try:
-> 2134                 return self._engine.get_loc(key)
   2135             except KeyError:

其次是:

KeyError: 'Country'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-45-740ea96e825f> in <module>()
     23 
     24 #energy['Country'] = energy['Country'].str.replace("A","B")
---> 25 energy['Country'] = energy['Country'].str.replace(r"\s+\(.*\)","")
     26 
     27 #energy['Country'] = energy['Country']

,然后继续进行。

有人可以解释该错误以及我需要纠正什么吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果索引中包含“国家/地区”,则无法使用df['Country']语法访问它。这仅适用于表列。但是,您还有其他选择。

我使用以下测试DataFrame来简化操作。

df = pd.DataFrame([('abb', 1, 2), ('abc', 2, 4), ('abd', 3, 7), ('abe', 4, 8), ('abg', 5, 6), ('abh', 6, 3)], columns=['Country', 'b', 'c'])

如果“国家”在索引(和单级索引)中,则可以执行以下替换。请注意,这在MultiIndex上将起作用。

df = df.set_index('Country')
df.index = df.index.str.replace(r"a","")

或者,您可以使用.reset_index将所有内容移出索引,然后移回列。然后,您可以根据需要进行索引。

df = df.set_index(['Country', 'b'])  # Move 2 columns into the index.
df = df.reset_index()  # Country & b are now back out of the index, as a normal columns.
df['Country'] = df['Country'].str.replace(r"a","")  # Normal indexing works.

在两种情况下,您都应该获得以下输出

  Country  b  c
0      bb  1  2
1      bc  2  4
2      bd  3  7
3      be  4  8
4      bg  5  6
5      bh  6  3