Очистка и заполнение категориальных переменных для анализа Data Science - PullRequest
1 голос
/ 11 мая 2019

У меня возникла самая первая проблема с машинным обучением, и я изо всех сил пытаюсь очистить свои категориальные особенности в моем наборе данных.Моя цель - создать систему рекомендаций по скалолазанию.

ПРОБЛЕМА 1:

У меня есть три столбца, связанные с ошибочной информацией:

Чтотеперь он выглядит так: Example Table

Как я хочу, чтобы он выглядел следующим образом: Would like my table to look like this...

Если вы группируете название местоположения, с этим именем будут связаны разные номера location_id и страны,Однако в каждом из этих несоответствий есть явный победитель / явное большинство.У меня есть набор данных из 2 миллионов записей и режим location_id & location_country GIVEN, где location_name подавляющим, указывая на один ответ (пример: «300» и «USA» для clear_creek).

Использование панд / pythonКак сгруппировать мой набор данных по имени_места, вычислить режим location_id & location_country на основе этого имени местоположения, а затем заменить все столбцы id и страны этими вычислениями режима на основе location_name для очистки моих данных?

Я играл с groupby, заменял, дублировал, но я думаю, что в конечном счете мне нужно будет создать функцию, которая будет делать это, и я, честно говоря, понятия не имею, с чего начать.(Я заранее извиняюсь за свою наивность в кодировании) Я знаю, что должно быть решение, мне просто нужно указать правильное направление.

ПРОБЛЕМА 2:

Кроме того, у кого-нибудь есть предложения по заполнению значений NaN в столбцах моей категории location_name (42 012/2 миллиона) и location_country (46 890/2 миллиона)?Лучше ли держать как неизвестное значение?Я чувствую, что заполнение этих функций на основе частоты будет ужасным смещением для моего набора данных.

data = {'index': [1,2,3,4,5,6,7,8,9], 
        'location_name': ['kalaymous', 'kalaymous', 'kalaymous', 'kalaymous',
                          'clear_creek', 'clear_creek', 'clear_creek', 
                          'clear_creek', 'clear_creek'],
        'location_id': [100,100,0,100,300,625,300,300,300], 
        'location_country': ['GRC', 'GRC', 'ESP', 'GRC', 'USA', 'IRE', 
                             'USA', 'USA', 'USA']}
df = pd.DataFrame.from_dict(data)

*** в поисках возврата:

improved_data = {'index': [1,2,3,4,5,6,7,8,9], 
            'location_name': ['kalaymous', 'kalaymous', 'kalaymous', 'kalaymous',
                              'clear_creek', 'clear_creek', 'clear_creek', 
                              'clear_creek', 'clear_creek'],
            'location_id': [100,100,100,100,300,300,300,300,300], 
            'location_country': ['GRC', 'GRC', 'GRC', 'GRC', 'USA', 'USA', 
                                 'USA', 'USA', 'USA']}

new_df = pd.DataFrame.from_dict(improved_data)

Ответы [ 3 ]

1 голос
/ 11 мая 2019

Мы можем использовать .agg в сочетании с pd.Series.mode и привести его обратно к вашему фрейму данных с помощью map:

m1 = df.groupby('location_name')['location_id'].agg(pd.Series.mode)
m2 = df.groupby('location_name')['location_country'].agg(pd.Series.mode)

df['location_id'] = df['location_name'].map(m1)
df['location_country'] = df['location_name'].map(m2)

print(df)
   index location_name  location_id location_country
0      1     kalaymous          100              GRC
1      2     kalaymous          100              GRC
2      3     kalaymous          100              GRC
3      4     kalaymous          100              GRC
4      5   clear_creek          300              USA
5      6   clear_creek          300              USA
6      7   clear_creek          300              USA
7      8   clear_creek          300              USA
8      9   clear_creek          300              USA
0 голосов
/ 11 мая 2019

Вы можете использовать transform, вычисляя режим с помощью df.iat[]:

df=(df[['location_name']].join(df.groupby('location_name').transform(lambda x: x.mode()
                                                   .iat[0])).reindex(df.columns,axis=1))
print(df)

  index location_name location_id location_country
0     1     kalaymous         100              GRC
1     1     kalaymous         100              GRC
2     1     kalaymous         100              GRC
3     1     kalaymous         100              GRC
4     5   clear_creek         300              USA
5     5   clear_creek         300              USA
6     5   clear_creek         300              USA
7     5   clear_creek         300              USA
8     5   clear_creek         300              USA
0 голосов
/ 11 мая 2019

Как отмечает Эрфан, было бы полезно узнать ожидаемый результат для первого вопроса.

Для вторых панд есть метод fillna . Вы можете использовать этот метод для заполнения значений NaN. Например, чтобы заполнить значения с помощью UNKNOWN_LOCATION, вы можете сделать следующее:

df.fillna('UNKNOWN_LOCATION')

См. Потенциальное решение для первого вопроса:

df.groupby('location_name')[['location_id', 'location_country']].apply(lambda x: x.mode())
...