【问题标题】:Unable to extract dataframe column using pandas无法使用熊猫提取数据框列
【发布时间】:2018-07-06 17:24:48
【问题描述】:

我是 pandas 的新手,正在努力重命名一列然后提取它。

我已将 xls 文件读入 pandas 数据框对象。

df = pd.read_excel("something.xls")
bank_statement.columns.values[0] = 'Din'
bank_statement.columns

这显示了列

Index([u'Din', u'Unnamed: 1', u'Unnamed: 2', u'Unnamed: 3', u'Unnamed: 4',
       u'Unnamed: 5', u'Unnamed: 6'],
      dtype='object')

但这会导致错误。

bank_statement.Din

错误是:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-6ce73c262cd1> in <module>()
----> 1 bank_statement.Din

/Users/monideepde/anaconda2/lib/python2.7/site-packages/pandas/core/generic.pyc in __getattr__(self, name)
   3612             if name in self._info_axis:
   3613                 return self[name]
-> 3614             return object.__getattribute__(self, name)
   3615 
   3616     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'Din'

与此相反,当我尝试对导入时命名的列执行相同操作时,我没有遇到任何问题。

data = pd.read_csv("/somepath/TestFrame.csv")
data

我可以访问这些列

谁能指出我哪里出错了?

谢谢

【问题讨论】:

标签: python pandas data-science data-cleaning


【解决方案1】:

不要使用 .values 更新 Pandas 内部结构:

bank_statement.columns.values[0] = 'Din'

改用对应的API函数/方法:

bank_statement = bank_statement.rename(columns={'Unnamed: 0':'Din'})

演示:

In [216]: df = pd.DataFrame(np.random.randn(3, 3), columns=list('abc'))

In [217]: df
Out[217]:
          a         b         c
0 -0.972161 -0.484091 -0.289475
1  1.081694  1.215217  0.241532
2 -0.581193  0.691856  0.194182

In [218]: df.columns
Out[218]: Index(['a', 'b', 'c'], dtype='object')

让我们破解它:

In [219]: df.columns.values[0] = 'Din'

它似乎有效:

In [220]: df.columns
Out[220]: Index(['Din', 'b', 'c'], dtype='object')

但是:

In [221]: df['Din']
...
skipped
...
KeyError: 'Din'

惊喜! Pandas 仍然认为它有一个a 列:

In [222]: df['a']
Out[222]:
0   -0.972161
1    1.081694
2   -0.581193
Name: Din, dtype: float64

解决方法:

In [224]: df.columns = ['Din'] + df.columns.tolist()[1:]

In [225]: df.columns
Out[225]: Index(['Din', 'b', 'c'], dtype='object')

In [226]: df['Din']
Out[226]:
0   -0.972161
1    1.081694
2   -0.581193
Name: Din, dtype: float64

【讨论】:

  • 非常感谢您的详细回复!
  • 出于好奇 - df.columns.values[0] = 'Din' 不起作用!你知道这是什么原因吗?它是一个错误(因为提供了一个 API 但它不起作用)还是有正当理由让它表现出它的行为方式?
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2018-04-15
  • 2019-03-24
  • 2023-02-25
  • 2017-06-26
相关资源
最近更新 更多