我想尝试 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,则标志 = 1,否则标志 = 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其中包括apply
、map
以及applymap
。
关于python - Pandas DataFrame ApplyMap 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21726275/