【问题标题】:Use idxmax for indexing in pandas在 pandas 中使用 idxmax 进行索引
【发布时间】:2014-12-29 22:09:30
【问题描述】:

这是我想要做的:

In [7]: from pandas import DataFrame, Series

In [8]: import pandas as pd

In [9]: import numpy as np

In [10]: df = DataFrame([[1.4, np.nan], [7.1, -4.5],
                [np.nan, np.nan], [0.75, -1.3]],
                index=['a', 'b', 'c', 'd'],
                columns=['one', 'two'])
Out[10]:
    one  two
a  1.40  NaN
b  7.10 -4.5
c   NaN  NaN
d  0.75 -1.3

In [11]: df.idxmax()
Out[11]:
one    b
two    d
dtype: object

In [12]: df[df.idxmax()] = -9.99
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-12-018b077daf48> in <module>()
----> 1 df[df.idxmax()] = -9.99

/usr/local/lib/python3.4/site-packages/pandas/core/frame.py in __setitem__(self, key, value)
   2103
   2104         if isinstance(key, (Series, np.ndarray, list, Index)):
-> 2105             self._setitem_array(key, value)
   2106         elif isinstance(key, DataFrame):
   2107             self._setitem_frame(key, value)

/usr/local/lib/python3.4/site-packages/pandas/core/frame.py in _setitem_array(self, key, value)
   2131                     self[k1] = value[k2]
   2132             else:
-> 2133                 indexer = self.ix._convert_to_indexer(key, axis=1)
   2134                 self._check_setitem_copy()
   2135                 self.ix._setitem_with_indexer((slice(None), indexer), value)

/usr/local/lib/python3.4/site-packages/pandas/core/indexing.py in _convert_to_indexer(self, obj, axis, is_setter)
   1141                     if isinstance(obj, tuple) and is_setter:
   1142                         return {'key': obj}
-> 1143                     raise KeyError('%s not in index' % objarr[mask])
   1144
   1145                 return _values_from_object(indexer)

KeyError: "['b' 'd'] not in index"

直觉上这应该有效,但它没有。有什么解决方法吗?

【问题讨论】:

  • 您是否要查找等于 -9.99 的行?
  • 我正在尝试修改这些点
  • 好的,所以 7.10 和 -1.3 都会变成 -9.99?
  • 是的,没错。但是在一个完美的世界里,检查平等也应该起作用。 :)
  • df[index] 选择列,而不是行。 df.idxmax() 返回一个序列,其是行标签

标签: python-3.x pandas


【解决方案1】:

您应该遍历系列并访问索引和列名来设置值:

In [30]:

for items in df.idxmax().iteritems():
    print(items)
    df.loc[items[1], items[0]] = -9.9
df
('one', 'b')
('two', 'd')
Out[30]:
    one  two
a  1.40  NaN
b -9.90 -4.5
c   NaN  NaN
d  0.75 -9.9

我已经打印了这些项目以显示内容是什么

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 2015-03-10
    • 2018-12-11
    • 2017-08-19
    • 2015-11-04
    • 2020-01-02
    • 2019-10-07
    • 2018-11-22
    相关资源
    最近更新 更多