代码之家  ›  专栏  ›  技术社区  ›  flamenco

如何通过map/apply在熊猫数据帧上使用lambda函数,其中lambda为每列取不同的值

  •  1
  • flamenco  · 技术社区  · 7 年前

    其思想是根据每列的特定值以最快的方式转换数据帧。 为了简单起见,这里有一个例子,将一个列的每个元素与它所属列的平均值进行比较,如果大于平均值(列),则用0替换,否则用1替换。

    In [26]: df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]))                                                                                                                                                               
    
    In [27]: df                                                                                                                                                                                                                
    Out[27]: 
       0  1  2
    0  1  2  3
    1  4  5  6
    
    In [28]: df.mean().values.tolist()                                                                                                                                                                                         
    Out[28]: [2.5, 3.5, 4.5]
    

    下面是一段代码片段,它不是真正的代码,而是更多地用于示例所需的行为。我用过 apply 方法,但它可以是任何运行最快的方法。

    In [29]: f = lambda x: 0 if x < means else 1                                                                                                                                                                               
    
    In [30]: df.apply(f)
    
    In [27]: df                                                                                                                                                                                                                
    Out[27]: 
       0  1  2
    0  0  0  0
    1  1  1  1 
    

    这是一个玩具例子,但解决方案必须应用于一个大数据帧,因此,它必须是快速的。

    干杯!

    1 回复  |  直到 7 年前
        1
  •  5
  •   Vaishali    7 年前

    通过将每个元素与该列的平均值进行比较,可以创建数据帧的布尔掩码。使用

    df > df.mean()
    
        0       1       2
    0   False   False   False
    1   True    True    True
    

    由于true等于1,而false等于0,因此使用astype可以很容易地将布尔数据帧转换为整数。

    (df > df.mean()).astype(int)
    
        0   1   2
    0   0   0   0
    1   1   1   1
    

    如果需要输出为某些字符串而不是0和1,请使用np.where,其工作方式为(条件,如果为true,则为else)

    pd.DataFrame(np.where(df > df.mean(), 'm', 'n'))
    
        0   1   2
    0   n   n   n
    1   m   m   m
    

    编辑:在注释中寻址qn;如果m和n依赖于列呢?

    df = pd.DataFrame(np.arange(12).reshape(4,3))
    
        0   1   2
    0   0   1   2
    1   3   4   5
    2   6   7   8
    3   9   10  11
    
    pd.DataFrame(np.where(df > df.mean(), df.min(), df.max()))
    
        0   1   2
    0   9   10  11
    1   9   10  11
    2   0   1   2
    3   0   1   2