[英]TypeError when using `df.apply` (Pandas)
我有一个看起来像这样的熊猫数据框:
我想记录数据框中每个值的日志。
因此,一开始似乎没有问题,然后: data.apply(lambda x:math.log(x))
返回类型错误(无法将系列转换为“ float”类)。
好的,好的-因此,尽管经常不赞成类型检查,但还是给了我一个机会(也尝试将x强制转换为浮点数,同样的问题):
isinstance((data['A1BG'][0]), np.float64)
返回true,所以我尝试了:
data.apply(lambda x: math.log(x) if isinstance(x, np.float64) else x)
。 运行没有任何错误,但是它没有更改我的数据框中的任何值。
我究竟做错了什么?
谢谢!
当你apply
一个数据帧时,应用功能将在一定投Pandas.Series
不是float(相反,当你使用apply
上一个系列)。 然后,而不是math.log
你应该使用np.log
)
编辑:
通过示例,它总是更好:
test = pd.DataFrame(columns = ['a','b'])
test.a = np.random.random(5)
test.b = np.random.random(5)
a b
0 0.430111 0.420516
1 0.367704 0.785093
2 0.034130 0.839822
3 0.310254 0.755089
4 0.098302 0.136995
如果您尝试以下操作,将无法使用:
test.apply(lambda x: math.log(x))
TypeError: ("cannot convert the series to <class 'float'>", 'occurred at index a')
但这可以完成工作:
test.apply(lambda x: np.log(x))
a b
0 -0.843711 -0.866273
1 -1.000476 -0.241953
2 -3.377588 -0.174565
3 -1.170364 -0.280919
4 -2.319708 -1.987811
发生的情况是df.apply
返回一个pd.Series
对象供lambda进行操作...它基本上一次在Series上进行操作,而不一次在一个float上进行操作。
因此,
data.apply(lambda x: math.log(x) if isinstance(x, np.float64) else x)
isinstance(x, np.float64)
永远不会为真(因为x
是pd.Series
类型),因此else总是执行。
为了解决这个问题,您可以使用df.applymap
一次操作一列:
data.applymap(math.log)
使用apply时,解决方案是相似的,但是您无法逃避lambda:
data.apply(lambda x: np.log(x))
或者,(pd 0.20):
data.transform(lambda x: np.log(x))
巧合的是, df.applymap
是最快的,其次是df.apply
和df.transform
。
尝试这个
import math
data.apply(lambda x:math.log(list(x)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.