2014-02-12 2 views
5

Я хотел испытать функциональность метода applymap объекта Pandas DataFrame. Вот Пример использования: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 else flag = 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 внутри пользовательской функции? I.e., является df1['Flag'], действительным в определении f()?

ответ

8

Функция f(x) не является особенной для pandas - это просто регулярная функция python. Таким образом, единственными данными в области f является переменная x Другие члены df1 недоступны.

От applymap Документов

Func: функция

функции Python, возвращает одно значение из одного значения

Таким образом, вы можете попробовать это:

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.

+0

Спасибо. Просто продолжение. В операторе df1 ['Flag'] = df1.applymap (f) .sum (axis = 1) .astype (bool), когда мы суммируем его по столбцам, тогда первая строка должна иметь значение 2 (1 + 1 +0) ?. Тогда bool должен быть истинным обрядом? Тогда почему это ложь? – Baktaawar

+0

да, извините - я скопировал результат из функции 'all', но написал в функции' sum' (bool (sum) дает True для всех строк, что не является хорошим примером). Исправлено. – Bonlenfum

+0

@ Baktaawar, если это решит вашу проблему, то в дополнение к «спасибо» было бы здорово, если бы вы могли принять ответ! – Owen

Смежные вопросы