【问题标题】:pandas return column name apply function for each row熊猫为每一行返回列名应用函数
【发布时间】:2017-11-07 03:05:12
【问题描述】:

我正在研究熊猫数据集。对于 2D 数据框,尝试返回/附加一列,该列返回值超过 0.95 的列名。

import pandas as pd
import numpy as np

Exp_day_list = ["EXP_DAY_1","EXP_DAY_2","EXP_DAY_3","EXP_DAY_4","EXP_DAY_5","EXP_DAY_6","EXP_DAY_7","EXP_DAY_8","EXP_DAY_9","EXP_DAY_10","EXP_GT_DAY_10"]


test = raw_databased.head()
Exp_day_percentage = test[Exp_day_list]


def over_95_percent(x):
    for column in x:
        if x[column] > 0.95:
            return column
            break
Exp_day_percentage.apply(over_95_percent,axis = 1)

我测试了 Exp_day_percentage,结果符合我的需要。

Exp_day_percentage
Out[2]: 
   EXP_DAY_1  EXP_DAY_2  EXP_DAY_3  EXP_DAY_4  EXP_DAY_5  EXP_DAY_6  \
0        0.0        0.0       0.52       0.94       0.94        1.0   
1        0.0        0.0       0.00       0.66       1.00        1.0   
2        0.0        1.0       1.00       1.00       1.00        1.0   
3        0.0        0.0       0.92       1.00       1.00        1.0   
4        0.0        0.0       0.95       0.97       1.00        1.0   

   EXP_DAY_7  EXP_DAY_8  EXP_DAY_9  EXP_DAY_10  EXP_GT_DAY_10  
0        1.0        1.0        1.0         1.0            0.0  
1        1.0        1.0        1.0         1.0            0.0  
2        1.0        1.0        1.0         1.0            0.0  
3        1.0        1.0        1.0         1.0            0.0  
4        1.0        1.0        1.0         1.0            0.0  

但是当我对该数据框运行应用函数时,错误函数如下:

TypeError: ("cannot do label indexing on <class 'pandas.indexes.base.Index'>  
with these indexers [0.0] of <type 'numpy.float64'>", u'occurred at index 0')

理想的结果如下:

   EXP_DAY_1  EXP_DAY_2  EXP_DAY_3  EXP_DAY_4  EXP_DAY_5  EXP_DAY_6  \
0        0.0        0.0       0.52       0.94       0.94        1.0   
1        0.0        0.0       0.00       0.66       1.00        1.0   
2        0.0        1.0       1.00       1.00       1.00        1.0   
3        0.0        0.0       0.92       1.00       1.00        1.0   
4        0.0        0.0       0.95       0.97       1.00        1.0   

   EXP_DAY_7  EXP_DAY_8  EXP_DAY_9  EXP_DAY_10  EXP_GT_DAY_10  Column
0        1.0        1.0        1.0         1.0            0.0  EXP_DAY_5
1        1.0        1.0        1.0         1.0            0.0  EXP_DAY_5
2        1.0        1.0        1.0         1.0            0.0  EXP_DAY_2
3        1.0        1.0        1.0         1.0            0.0  EXP_DAY_4
4        1.0        1.0        1.0         1.0            0.0  EXP_DAY_3

如果有人可以帮助我,我将不胜感激。我搜索了所有互联网,找不到类似的东西。谢谢你

【问题讨论】:

    标签: python pandas dataframe apply


    【解决方案1】:

    使用pd.DataFrame.idxmax

    df.assign(Column=df.gt(.95).assign(zip5=1).idxmax(1))
    
       EXP_DAY_1  EXP_DAY_2  EXP_DAY_3  EXP_DAY_4  EXP_DAY_5  EXP_DAY_6  EXP_DAY_7  EXP_DAY_8  EXP_DAY_9  EXP_DAY_10  EXP_GT_DAY_10     Column
    0        0.0        0.0       0.52       0.94       0.94        1.0        1.0        1.0        1.0         1.0            0.0  EXP_DAY_6
    1        0.0        0.0       0.00       0.66       1.00        1.0        1.0        1.0        1.0         1.0            0.0  EXP_DAY_5
    2        0.0        1.0       1.00       1.00       1.00        1.0        1.0        1.0        1.0         1.0            0.0  EXP_DAY_2
    3        0.0        0.0       0.92       1.00       1.00        1.0        1.0        1.0        1.0         1.0            0.0  EXP_DAY_4
    4        0.0        0.0       0.95       0.97       1.00        1.0        1.0        1.0        1.0         1.0            0.0  EXP_DAY_4
    

    【讨论】:

    • 非常感谢您的帮助。你怎么知道 gt 在这种情况下会起作用?我之前从 pandas 看过文档,但我不知道在哪里可以找到相关功能?另外,你能告诉我为什么我的代码不起作用吗?
    • pd.DataFrame.gt 是大于方法。它是df &gt; .95 的代名词或完整的东西(df &gt; .95).idxmax(1)
    • 嗨,piRSquared。关于这个话题的问题。我发现如果 gt 返回所有 false,idxmax 将返回所有第一列。如何用某些常量值列表 NA 替换它。 (返回第一列会让我再次清理数据。
    • 在这种情况下你希望它返回什么?
    • 最好参考该表中的另一列。例如,我有 zip5 - EXP_DAY_1 EXP_DAY_2 EXP_DAY_3 EXP_DAY_4 EXP_DAY_5 EXP_DAY_6 EXP_DAY_7 EXP_DAY_8 EXP_DAY_9 EXP_DAY_10 EXP_GT_DAY_10 。作为列表。如果全部为 False,则返回 ZIP5。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2014-07-04
    • 2023-01-18
    • 1970-01-01
    • 2017-11-27
    • 2017-08-23
    相关资源
    最近更新 更多