繁体   English   中英

使用df.apply(熊猫)时发生TypeError

[英]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)永远不会为真(因为xpd.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.applydf.transform

尝试这个

 import math
 data.apply(lambda x:math.log(list(x)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM