Pandas最大单元格值

时间:2016-08-04 08:32:04

标签: python pandas dataframe max cumsum

我有一个df,最左边的列有一些代码,其他列有一个前向的配置文件(下面的df1)

DF1:

   code        tp1        tp2        tp3        tp4        tp5       tp6  \
0  1111   0.000000   0.000000   0.018714   0.127218   0.070055  0.084065   
1   222   0.000000   0.000000   0.000418   0.000000   0.017540  0.003015   
2   333   1.146815   1.305678   0.384918   0.688284   0.000000  0.000000   
3   444   0.000000   0.000000   1.838797   0.000000   0.000000  0.000000   
4   555  27.190002  27.134837  24.137560  17.739465  11.990806  8.631395   
5   666   0.000000   0.000000   0.000000   0.000000   0.000000  0.000000   

        tp7        tp8        tp9       tp10  
0  0.019707   0.000000   0.000000   0.000000  
1  6.594860  10.535905  15.697232  21.035824  
2  0.000000   0.000000   0.000000   0.000000  
3  0.000000   0.000000   0.000000   0.000000  
4  7.476197   6.461532   5.570051   4.730345  
5  0.000000   0.000068   0.000000   0.000000  

我希望输出为3列df(下面的df2),其中包含单元格的列名(对于每个代码),其具有最后一个数字(+ ve或-ve),之后只有0。第二列(tp_with_max_num)将具有具有最大此类数字的列名称。

DF2:

   code max_tp tp_with_max_num
0  1111    tp7             tp4
1   222   tp10            tp10
2   333    tp4             tp2
3   444    tp3             tp3
4   555   tp10             tp1
5   666    tp8             tp8

使用此:name of column, that contains the max value 我能够获得第3列:

input_df['tp_with_max_num'] = input_df.ix[0:6,1:].apply(lambda x: input_df.columns[1:][x == x.max()][0], axis=1)

我无法解决df2中的第二列....

3 个答案:

答案 0 :(得分:5)

知道idxmax返回第一个最大值的索引,您可以使用cumsum查找只有零的列:

df.ix[:, 'tp1':].cumsum(axis=1).idxmax(axis=1)
Out[61]: 
0     tp7
1    tp10
2     tp4
3     tp3
4    tp10
5     tp8
dtype: object

答案 1 :(得分:2)

如果您暂时将argmax替换为0,则可以使用行上的NaN返回第二列最大值的列名称,然后您可以使用last_valid_index返回具有最后一个非零值的列:

In [117]:
df['max_tp'], df['tp_with_max_num'] = df.ix[:,'tp1':].replace(0,np.NaN).apply(lambda x: x.last_valid_index(), axis=1), df.ix[:,'tp1':].apply(lambda x: x.argmax(), axis=1)
df[['max_tp','tp_with_max_num']]

Out[117]:
  max_tp tp_with_max_num
0    tp7             tp4
1   tp10            tp10
2    tp4             tp2
3    tp3             tp3
4   tp10             tp1
5    tp8             tp8

答案 2 :(得分:1)

使用速度更快:

print (df.ix[:,'tp1':].idxmax(axis=1))
0     tp4
1    tp10
2     tp2
3     tp3
4     tp1
5     tp8
dtype: object

<强>计时

df = pd.concat([df]*1000).reset_index(drop=True)

In [128]: %timeit (df.ix[:,'tp1':].idxmax(axis=1))
100 loops, best of 3: 5.9 ms per loop

In [129]: %timeit (df.ix[:,'tp1':].apply(lambda x: x.argmax(), axis=1))
1 loop, best of 3: 237 ms per loop

In [130]: %timeit (df.ix[:,'tp1':].replace(0,np.NaN).apply(lambda x: x.last_valid_index(), axis=1))
10 loops, best of 3: 126 ms per loop

In [131]: %timeit (df.ix[:, 'tp1':].cumsum(axis=1).idxmax(axis=1))
100 loops, best of 3: 6.71 ms per loop

所以我和ayhan解决方案的速度越快。