Pandas DataFrame的ApplyMap方法

7

我想尝试使用Pandas DataFrame对象的applymap方法。以下是用例:

假设我的DataFrame df1如下:

Age   ID       Name
0   27  101    John
1   22  102    Bob
2   19  103    Alok
3   27  104    Tom
4   32  105    Matt
5   19  106    Steve
6    5  107    Tom
7   55  108    Dick
8   67  109    Harry

我现在想要创建一个标志变量,逻辑是如果元素的长度小于2,则flag=1,否则flag=0。

为了以元素为单位运行此操作,我想使用applymap方法。因此,我创建了以下用户定义函数:

def f(x): 
   if len(str(x))>2: 
       df1['Flag']=1
   else: 
      df1['Flag']=0

接着我运行了 df1.applymap(f),结果如下:

    Age    ID  Name
0  None  None  None
1  None  None  None
2  None  None  None
3  None  None  None
4  None  None  None
5  None  None  None
6  None  None  None
7  None  None  None
8  None  None  None

如何使用applymap实现所需功能,而不是创建一个具有标志值的标志变量?

我们不能在用户定义的函数内部使用DataFrame变量名称或pandas语句吗?即,在f()的定义内部使用df1 ['Flag']是否有效?

1个回答

10

f(x)函数对于Pandas并不特殊,它只是一个普通的Python函数。因此,在f内部作用域中唯一可用的数据是变量xdf1的其他成员不可用。

来自applymap文档:

func: function

Python函数,从单个值返回单个值

您可以尝试使用以下代码:

def f(x):
    if len(str(x)) <= 3: return 1
    else: return 0

应用时,对帧中的每个元素输出1/0:

df1.applymap(f)

>>>
   Age  ID  Name
0    1   1     0
1    1   1     1
2    1   1     0
3    1   1     1
4    1   1     0
5    1   1     0
6    1   1     1
7    1   1     0
8    1   1     0

要将结果用于在每一行中添加另一个变量,您需要每行一个值,例如:

df1['Flag'] = df1.applymap(f).all(axis=1).astype(bool)

>>> df1

   Age   ID   Name   Flag
0   27  101   John  False
1   22  102    Bob   True
2   19  103   Alok  False
3   27  104    Tom   True
4   32  105   Matt  False
5   19  106  Steve  False
6    5  107    Tom   True
7   55  108   Dick  False
8   67  109  Harry  False

还要查看https://dev59.com/R2Ij5IYBdhLWcg3w4Izt#19798528,该文章涵盖了applymap以及applymap


谢谢。只是跟进一下。在df1 ['Flag'] = df1.applymap(f).sum(axis=1).astype(bool)语句中,当我们按列求和时,第一行不应该有值为2(1 + 1 + 0)吗?然后它的布尔值应该是True吧?那为什么是False呢? - Baktaawar
是的,抱歉 - 我从“all”函数中复制了结果,但是在“sum”函数中编写了它(bool(sum)对于所有行都返回True,这不是一个好的示例)。现在已经修复了。 - Bonlenfum
@Baktaawar 如果这个解决了你的问题,除了“谢谢”之外,如果你能接受这个答案就更好了! - Owen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接