【问题标题】:Pandas apply rowwise function on multiple columnsPandas 在多列上应用逐行函数
【发布时间】:2021-01-27 09:55:19
【问题描述】:

我有一个数据框和一个函数,我想通过 pandas.apply 将其应用于多个列。目前我正在使用 for 循环这样做,我想用一行代码替换它。

这是我的数据框:

d1 = {'id': [1, 1, 2], 'event': ['e', 'c', 'e'], 'var1': [1, 2, 2], 'time_difference': [0, 5, 2]}
df1 = pd.DataFrame(data=d1)
...
>> df1 
   id event  var1  time_difference
0   1     e     1                0
1   1     c     2                5
2   2     e     2                2

这是我要应用的功能:

def merge_based_on_timelimit(row):
    return row[column_of_interest] if row['time_difference'] <= 1\
        else pd.NA

这些是我感兴趣的列(我想在其上应用函数):

columns_of_interest = ['event', 'var1']

目前我正在通过 for 循环将我的函数应用于所有感兴趣的列:

for column_of_interest in columns_of_interest:
    df1[column_of_interest] = df1.apply(merge_based_on_timelimit, axis=1)

但是,我正在寻找一种方法来跳过循环,而是将我的函数直接应用于所有感兴趣的列。我怎样才能做到这一点? 到目前为止,我已经尝试了以下方法:

df1[columns_of_interest] = df1[columns_of_interest].apply(merge_based_on_timelimit, axis=1)

返回以下错误:

...
redcap[columns_of_interest] = redcap[columns_of_interest].apply(merge_based_on_timelimit, axis=1)
...
KeyError: 'time_difference'

【问题讨论】:

    标签: python pandas function apply redcap


    【解决方案1】:

    在我看来这里apply 是没有必要的,使用DataFrame.loc 通过&gt; 1 的反转掩码设置值:

    df1.loc[df1['time_difference'] > 1, columns_of_interest] = pd.NA
    
    print (df1)
       id event  var1  time_difference
    0   1     e     1                0
    1   1  <NA>  <NA>                5
    2   2  <NA>  <NA>                2
    

    您的解决方案可以通过以下方式更改:

    def merge_based_on_timelimit(row):
        #added s to column_of_interest
        return row[columns_of_interest] if row['time_difference'] <= 1\
            else pd.NA
    columns_of_interest = ['event', 'var1']
    
    #added column time_difference to list
    df1[columns_of_interest] = df1[columns_of_interest + ['time_difference']].apply(merge_based_on_timelimit, axis=1)
    
    print (df1)
       id event  var1  time_difference
    0   1     e     1                0
    1   1  <NA>  <NA>                5
    2   2  <NA>  <NA>                2
    

    【讨论】:

    • 谢谢!我使用了您的第一个答案,它比我所做的要优雅得多。
    猜你喜欢
    • 2023-04-08
    • 2016-07-02
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2018-01-18
    相关资源
    最近更新 更多