【问题标题】:Apply function to all rows in pandas dataframe (lambda)将函数应用于熊猫数据框(lambda)中的所有行
【发布时间】:2022-01-04 17:37:15
【问题描述】:

我有以下函数用于获取行的最后一个非零值的列名

import pandas as pd

def myfunc(X, Y):
    df = X.iloc[Y]
    counter = len(df)-1
    while counter >= 0:
        if df[counter] == 0:
            counter -= 1
        else:
            break
    return(X.columns[counter])

使用以下代码示例

data = {'id':  ['1', '2', '3', '4', '5', '6'],
        'name': ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'GGG'],
        'A1': [1, 1, 1, 0, 1, 1],
        'B1': [0, 0, 1, 0, 0, 1],
        'C1': [1, 0, 1, 1, 0, 0],
        'A2': [1, 0, 1, 0, 1, 0]}

df = pd.DataFrame(data)
df

myfunc(df, 5) # 'B1'

我想知道如何将此函数应用于数据框中的所有行,并将结果放入 df 的新列中

我正在考虑遍历所有行(这可能不是好方法)或使用带有 apply 函数的 lambda。但是,我没有成功采用最后一种方法。有什么帮助吗?

【问题讨论】:

    标签: python pandas dataframe lambda apply


    【解决方案1】:

    我已经稍微修改了你的函数以跨行工作:

    def myfunc(row):
         counter = len(row)-1
         while counter >= 0:
             if row[counter] == 0:
                 counter -= 1
             else:
                 break
         return row.index[counter]
    

    现在只需调用您的函数 df.applyaxis=1 为数据帧的每一行调用函数:

    >>> df.apply(myfunc, axis=1)
    0    A2
    1    A1
    2    A2
    3    C1
    4    A2
    5    B1
    dtype: object
    

    但是,您可以放弃自定义函数并使用此代码以更快、更简洁的方式完成您正在寻找的工作:

    >>> df[df.columns[2:]].T.cumsum().idxmax()
    0    A2
    1    A1
    2    A2
    3    C1
    4    A2
    5    B1
    dtype: object
    

    【讨论】:

      【解决方案2】:

      这是一个使用DataFrame.idxmax 的更简单、更快速的解决方案。

      >>> res = df.iloc[:, :1:-1].idxmax(axis=1)
      >>> res
      
      0    A2
      1    A1
      2    A2
      3    C1
      4    A2
      5    B1
      dtype: object
      

      这个想法是只选择AiBi列并颠倒它们的顺序(df.iloc[:, :1:-1]),然后返回每行第一次出现最大值的列标签(在这种情况下为1) (.idxmax(axis=1))。

      请注意,此解决方案(作为另一个答案)假定每一行至少包含一个高于零的条目。

      如果我们首先屏蔽非零条目(使用.ne(0)),这个假设可以放宽为“每一行至少包含一个非零条目”。这是因为.ne(0) 产生一个布尔掩码和True > False <=> 1 > 0

      >>> res = df.iloc[:, :1:-1].ne(0).idxmax(axis=1)
      res
      
      0    A2
      1    A1
      2    A2
      3    C1
      4    A2
      5    B1
      dtype: object
      

      【讨论】:

        猜你喜欢
        • 2021-07-22
        • 2018-11-13
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 2020-09-08
        • 2018-03-27
        • 2019-02-07
        相关资源
        最近更新 更多