Как применить функцию к столбцу? - PullRequest
0 голосов
/ 13 октября 2019

Для заданной строки, такой как 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 голосов
/ 13 октября 2019

Как насчет этого чудовищного однослойника?

>>> df['State'].apply(lambda x: sum(float(i) for i in x.split('_')) > 6).tolist()
[False, False, True]
0 голосов
/ 13 октября 2019

Это хороший пример для комбинации eval и apply

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]
0 голосов
/ 13 октября 2019

Лично я бы не использовал 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 оставлено в качестве упражнения для читателя. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...