Pandas 最大单元格值的列名

Pandas column name of the max cell value

我有一个 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 .第 2 列 (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

使用这个: 我能够获得第 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 中的第二列....

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

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

使用速度更快:

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

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

知道idxmax returns 第一个 最大值的索引,您可以使用 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