2014-02-12 97 views
5

我想试用方法的Pandas DataFrame对象的功能。下面是使用案例:熊猫DataFrame ApplyMap方法

让说我的数据帧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,则标志= 1 else 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语句吗?也就是df1['Flag']里面有效的f()的定义?

回答

8

函数f(x)对于熊猫来说并不特别 - 它只是一个普通的python函数。因此,f范围内的唯一数据是变量xdf1的其他成员不可用。

applymap文档:

FUNC:功能

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://stackoverflow.com/a/19798528/1643946覆盖applymap如以及applymap

+0

谢谢。只是后续行动。在df1 ['Flag'] = df1.applymap(f).sum(axis = 1).astype(bool)语句中,当我们按列求和时,第一行的值应该为2(1 + 1 +0)?那么bool应该是真实的仪式?那么为什么它是假的? – Baktaawar

+0

是的,对不起 - 我从'all'函数中复制了结果,但是在sum函数中写入了结果(bool(sum)给出了所有行的True,这不是一个好例子)。现在修复。 – Bonlenfum

+0

@Baktaawar如果这解决了您的问题,那么除了“谢谢”之外,如果您能接受答案,这将非常棒! – Owen