使用python 2.7和pandas 0.9.1生成以下代码。
我的数据框有两列'minor'和'major'。我通过获取两者的最大绝对值来计算“临界”值,并构建一个名为“批评者”的新列:
>>> 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()?
提前致谢
答案 0 :(得分: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])
IOW:
>>> 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
方法不是'不好的。