【问题标题】:Attempt to access dataframe column displays "<bound method NDFrame.xxx..."尝试访问数据框列显示“<bound method NDFrame.xxx...”
【发布时间】:2017-09-16 00:01:49
【问题描述】:

我在 Jupyter notebook 中创建 DataFrame 对象:

data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
       'year':[2000, 2001, 2002, 2000, 2001],
       'pop':[1.5, 2.0, 3.6, 2.4, 2.9]}
frame = DataFrame(data)

当我提取列'年份'时,没关系:

In [30]: frame.year
Out[30]: 0    2000
         1    2001
         2    2002
         3    2000
         4    2001
         Name: year, dtype: int64

但是当我提取列'pop'(frame.pop)时,结果是:

Out[31]:
<bound method NDFrame.pop of    pop   state  year
0  1.5    Ohio  2000
1  2.0    Ohio  2001
2  3.6    Ohio  2002
3  2.4  Nevada  2000
4  2.9  Nevada  2001>

为什么结果与“frame.year”不一样?

【问题讨论】:

  • pop是dataframe的保留方法,请改用frame['pop']
  • pop 是保留的,请尝试更改列名以简化 DF 的使用。例如frame.rename(columns={'pop':'population'})
  • 使用 frame['pop'] 而不是 frame.pop 以避免与内置函数的名称冲突;如果名称包含空格,则也是必需的。根据@cs95 的回答。

标签: python pandas dataframe


【解决方案1】:

pop 是一个数据帧级别的函数。这里的要点是尽量避免使用. 访问器来访问列。有许多数据框属性和函数可能与您的列名冲突,在这种情况下,. 将调用这些属性和函数而不是您的列。

您想改用[..] dict 访问器:

frame['pop']
0    1.5
1    2.0
2    3.6
3    2.4
4    2.9
Name: pop, dtype: float64

如果你想使用pop,你可以。方法如下:

frame.pop('pop') 
0    1.5
1    2.0
2    3.6
3    2.4
4    2.9
Name: pop, dtype: float64

frame
    state  year
0    Ohio  2000
1    Ohio  2001
2    Ohio  2002
3  Nevada  2000
4  Nevada  2001

请注意,这会修改原始数据框,因此除非您尝试删除列,否则不要这样做。

【讨论】:

  • 刚遇到这个问题。显然我使用 nunique 而不是 nunique()
【解决方案2】:

我的使用方式 ...eval

frame.eval('pop')
Out[108]: 
0    1.5
1    2.0
2    3.6
3    2.4
4    2.9
dtype: float64

【讨论】:

  • 既然可以使用 dict 访问器,为什么还要使用 eval
  • @Bharathshetty 只是因为我的习惯.. 我最常使用queryeval
【解决方案3】:

poppandas.DataFrame 的一个方法。你需要使用frame['pop']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2020-03-01
    相关资源
    最近更新 更多