如何将函数应用于列?

时间:2019-10-13 07:37:14

标签: python pandas numpy dataframe

对于像1_2_5这样的给定字符串,我需要获取1+2+5 = 8的值之和,然后指定它是否大于6

我有下面的代码很好用

import numpy as np
import pandas as pd
np.sum( list( map( float, "1_2_5".split("_"))))> 6

现在想象我有一个具有相同字符串的数据框

dict = {"State":["0_0_1","4_0_0","4_0_3"]}
dt = pd.DataFrame(data=dict)

我需要对列(State)应用相同的逻辑。这是我的代码:

np.sum( list( map( float, dt["State"].apply(lambda x: x.split("_")))))> 6

但它抱怨:

TypeError: float() argument must be a string or a number, not 'list'

3 个答案:

答案 0 :(得分:0)

我个人不会使用apply()

>>> [sum(map(float, s.split('_'))) for s in dt.State]
[1.0, 4.0, 7.0]

这将为每一行计算一个单独的总和。如果您需要总和:

>>> sum(sum(map(float, s.split('_'))) for s in dt.State)
12.0

与之比较,剩下的6作为练习供读者阅读。 :)

答案 1 :(得分:0)

这个可怕的单线飞机怎么样?

>>> df['State'].apply(lambda x: sum(float(i) for i in x.split('_')) > 6).tolist()
[False, False, True]

答案 2 :(得分:0)

这似乎是evalapply组合的好例子

import numpy as np
import pandas as pd

dict = {"State":["0_0_1","4_0_0","4_0_3"]}
dt = pd.DataFrame(data=dict)

dt["State"].apply(lambda x: eval(x.replace("_", "+"))>6)

并输出:

0    False
1    False                                                  
2     True                                                  
Name: State, dtype: bool                                    
[Program finished]