我想试试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 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()的定义内有效吗?
解决方法
函数f(x)对于pandas并不特殊 – 它只是一个常规的python函数.因此f中范围内唯一的数据是变量x df1的其他成员不可用.
来自applymap文档:
func : function
Python function,returns a single value from a single value
所以你可以试试这个:
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.