使用地图方法更改Pandas DataFrame索引时出错

时间:2018-07-25 08:07:12

标签: python string pandas dataframe

import pandas as pd
import numpy as np
import string
df = pd.DataFrame(np.arange(12).reshape(3,4), index = list('abc'), columns = list('wxyz'))
df
   w  x   y   z
a  0  1   2   3
b  4  5   6   7
c  8  9  10  11

我知道我可以通过map方法来更改索引。

df.index.map(str.upper)

想知道我是否可以通过这种方式更改索引。

df.index.map(string.ascii_lowercase)    

但是,当我运行代码时,出现以下错误

TypeError: 'str' object is not callable

有人可以解释语法上的差异和错误的原因。

2 个答案:

答案 0 :(得分:0)

在语法上没有区别。您用作pandas.Index.map的参数的对象类型有所不同。该文档明确了允许的内容:

  

索引。地图映射器
  将映射器功能应用于索引。

     

映射器可调用
  要应用的功能。

通常,比起测试对象是否是一个函数,最好是测试一个对象是否可调用。原理请参见What is duck typing?

在这种情况下,str.upper是可调用的,而string.ascii_lowercase是字符串。要确认这一点,您可以使用callable(Python 3.2 +):

callable(str.upper)               # True
callable(string.ascii_lowercase)  # False

答案 1 :(得分:0)

不推荐使用string软件包。

import string 

string.__doc__

"A collection of string operations (most are no longer used).
\n\nWarning: most of the code you see here isn't normally used nowadays [...]

内置str允许您执行大多数操作。如零字符串所述,ascii_lowercase只为您提供小写字母。

如果要实现的目的是将DataFrame索引设置为小写,则应该执行df.index.map(str.lower)

import pandas as pd
import numpy as np
import string
df = pd.DataFrame(np.arange(12).reshape(3,4), index = list('ABC'), columns = list('wxyz'))
df.index.map(str.lower)
   w  x   y   z
a  0  1   2   3
b  4  5   6   7
c  8  9  10  11