Применение функции к фрейму данных не будет работать, ошибка AttributeError в функции - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь применить функцию, которая будет возвращать «очищенные» значения электронной почты. Однако у меня возникают трудности с применением моей функции к моей уважаемой колонке.

Пожалуйста, порекомендуйте лучший подход.

Пример данных:

sample_data= {'email': ['Sam@mail.com','Sam@mail.com',
                        'Doug@mail.com', 'Doug@mail.com',
                       np.NAN, np.NAN],
              'price': [25.95, 31.25, 34.95, 19.95, 59.95, 15.75]}

sample_df = pd.DataFrame(sample_data)

# print(sample_df)
    email   price
0   Sam@mail.com    25.95
1   Sam@mail.com    31.25
2   Doug@mail.com   34.95
3   Doug@mail.com   19.95
4   NaN     59.95
5   NaN     15.75

Применить функцию:

def clean_emails(s):
    emails = {x: str(x).lower() for x in s.unique()}
    return s.map(emails)

# Passing the column directly into the function works
sample_df.email = clean_emails(sample_df.email)

# So does passing the entire df into an apply statement
sample_df = sample_df.apply(clean_emails)

print(sample_df)

    email   price
0   sam@mail.com    25.95
1   sam@mail.com    31.25
2   doug@mail.com   34.95
3   doug@mail.com   19.95
4   nan     59.95
5   nan     15.75

Как показано, передача столбца непосредственно в функцию работает. Так же, применяя весь DF. Меня интересуют большие наборы данных, передающие в функцию один столбец.

Подводя итог, можно сказать, что передает единственный столбец df в функцию, лучший подход для решения этой проблемы? Или можно apply использовать?

1 Ответ

1 голос
/ 11 июня 2019

Используемая вами функция использует unique(), которая не является свойством DataFrame. Кажется, вы хотели применить его к серии, а не к фрейму данных.

Несколько вещей, которые нужно иметь в виду.

  1. Ваша функция будет применять str к NaN значениям и превращать их в строки, которые затем не будут распознаваться pd.isnull. Я не думаю, что вы этого хотите
  2. Я забыл:)
import numpy as np
import pandas as pd

sample_data= pd.DataFrame({'email': ['Sam@mail.com','Sam@mail.com', 'Doug@mail.com', 'Doug@mail.com', np.NAN, np.NAN],
'price': [25.95, 31.25, 34.95, 19.95, 59.95, 15.75]})

sample_data.email =  sample_data.email.str.lower()

Вы также можете просто сделать это

email_dict = {el: el.lower() for el in sample_data.email.unique() if pd.notnull(el)}
sample_data.email = sample_data.email.replace(email_dict)
...