0

以下代码是使用 python 2.7 和 pandas 0.9.1 生成的。

我有一个包含“次要”和“主要”两列的数据框。我通过取两者的最大绝对值来计算“临界”值,并建立一个名为“critic”的新列:

>>> import pandas as pd
>>> df = pd.DataFrame(
...:     {'minor':[-6, -2.3, 19.2], 'major':[2, 3, 7.4]},
...:     index=[10,20,30])
>>> print df
    major  minor
10    2.0   -6.0
20    3.0   -2.3
30    7.4   19.2
>>> df['critic'] = df[['minor', 'major']].abs().max(axis=1)
>>> print df
    major  minor  critic
10    2.0   -6.0     6.0
20    3.0   -2.3     3.0
30    7.4   19.2    19.2  

我的问题是建立一个新列,比如说“critic_vector”,显示给出这个值的列名。直到现在,我都是这样使用 DataFrame.apply() 的:

>>> def get_col_name(row, df, headers):
        tmp = (abs(df[headers].ix[row.name]) == row['critic'])
        retval = tmp.index[tmp.argmax()]
        return retval
>>> df['critic_vector'] = df.apply(get_col_name,
                                     axis=1,
                                     args=(df ,['minor', 'major']))
>>>print df
    major  minor  critic critic_vector
10    2.0   -6.0     6.0       minor
20    3.0   -2.3     3.0       major
30    7.4   19.2    19.2       minor

它工作正常;然而,处理大量数据时,df.apply() 函数是我的第一个瓶颈。有没有办法直接做到这一点,而不使用 df.apply() ?

提前致谢

4

1 回答 1

0

随机想法:要获取索引,您可以使用.idxmax而不是max,即

>>> w = df[['minor','major']].abs().idxmax(axis=1)
>>> w
10    minor
20    major
30    minor
dtype: object

然后你可以使用lookup(可能有更简单的东西,但我现在错过了):

>>> df.lookup(df.index, w)
array([ -6. ,   3. ,  19.2])

爱荷华州:

>>> df['critic_vector'] = df[['minor','major']].abs().idxmax(axis=1)
>>> df['critic'] = abs(df.lookup(df.index, df.critic_vector))
>>> df
    major  minor critic_vector  critic
10    2.0   -6.0         minor     6.0
20    3.0   -2.3         major     3.0
30    7.4   19.2         minor    19.2

我对这条线不太满意lookup——当然,你可以用你原来max的电话来代替它——但我认为这种idxmax方法还不错。

于 2013-05-27T14:20:55.063 回答