【问题标题】:How to apply function to a dataframe passing a column as an argument如何将函数应用于将列作为参数传递的数据框
【发布时间】:2021-05-18 09:01:40
【问题描述】:

我有一个数据框

        df: 
        | A     | B |
    1   | "USA" | 2 |
    2   | "USA" |NAN|
    3   | "GER" | 3 |
    4   | "FRA" | 4 |

以及一个检查值是否在某个位图中的函数,如果是则返回true,否则返回false

import pandas as pd
import numpy as np
import os
def valInBitmap(reason, bitmap):
    if(pd.isna(bitmap)):
        return(False)
    if(reason == bitmap):
        return(True)
    n = 0
    while(bitmap>=0):
        if(bitmap<2**n):#4 < 2^3 <8 n= 3
            #print("bitmap:" +str(bitmap) +" < 2^n: 2^" +str(n)+" = "+str(n**2))
            if(reason == 2**(n-1)):#2 == 2^(3-1) = 4
                return(True)
                break
            bitmap = bitmap - 2**(n-1)          
            n = 0
        n  =n+1
    return(False)

现在我想在“B”列上使用函数并将每一行的结果返回到新的“C”列

df['C'] = df.apply(lambda row : valInBitmap(2,df['B']), axis = 1)

最终的数据框应如下所示:

        df: 
        |   A   |  B  |   C   |
    1   | "USA" |  2  | True  |
    2   | "USA" |  NA | False |
    3   | "GER" |  3  | True  |
    4   | "FRA" |  4  | False |

但是在执行代码时,我收到以下错误消息

Exception has occurred: ValueError
('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 1')

我已经阅读了有关此错误消息的其他主题,但我无法完全理解它并使用建议的解决方案来解决我的问题。我做错了什么?

【问题讨论】:

    标签: python pandas dataframe function apply


    【解决方案1】:

    您可以在数据框上使用 apply 函数,也可以在单个列上使用。如果只需要B列,可以使用:

    df['C'] = df['B'].apply(valInBitmap)
    

    函数会一一接收B列的值,函数返回的值都会保存为C中的值。

    【讨论】:

    • 好的,所以我会更改函数,使其只需要 1 个参数,即列,而另一个参数根本不传递?
    • 没错! 2 并不多,如果您愿意,您可以在函数中对其进行硬编码。在您的 Python 旅程中的某个时刻,您可能希望在整个数据帧上使用 apply,所以您已经对此有所了解了。
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2023-03-28
    • 2020-05-03
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    相关资源
    最近更新 更多