【问题标题】:Pandas column name of the max cell value最大单元格值的 Pandas 列名
【发布时间】:2016-12-10 06:41:27
【问题描述】:

我有一个 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

使用这个:name of column, that contains the max value 我能够获得第三列:

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 中的第 2 列....

【问题讨论】:

    标签: python pandas dataframe max cumsum


    【解决方案1】:

    您可以在行上使用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
    

    【讨论】:

    • 很好.. 谢谢.. 对第二列有什么想法吗?或者我只需要迭代并删除尾随的 0 吗?
    【解决方案2】:

    使用更快:

    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 的解决方案。

    【讨论】:

    • 明白..刚刚获得这样做的权利:) 做到了..谢谢!
    • 你可以做到,因为你的声望高达 15 ;)
    【解决方案3】:

    知道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
    

    【讨论】:

    • 不过,您必须稍微更改它才能使用负数。问题示例中没有,但稍后可能会有一些,因此您可以在执行cumsum 之前向abs 打个电话。
    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多