Карта панд на серии - PullRequest
       6

Карта панд на серии

0 голосов
/ 28 сентября 2018

У меня есть DataFrame с большим количеством категорий, но я пытаюсь использовать только две.Мне удалось получить желаемый результат, но он не был принят в моем проекте («есть лучшие способы сделать это»).Работая с 2 столбцами - Пол (M / F) и Показано (1/0) Я пытаюсь вывести 4 переменные: мужской1, мужской0, женский1, женский0, чтобы создать гистограмму с ними.

Мне сказали использовать функцию pd.series.map, но я искал повсюду и не могу найти хороший пример - также не совсем уверен, как извлечь из нее 4 переменные.

Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

pd.Series.map не требуется.Вы можете использовать GroupBy здесь и вывести словарь:

df = pd.DataFrame([['M', 0], ['M', 1], ['M', 1], ['F', 0], ['F', 0], ['F', 1]],
                  columns=['Gender', 'Showed'])

d = df.groupby(['Gender', 'Showed']).size().to_dict()

# {('F', 0): 2, ('F', 1): 1, ('M', 0): 1, ('M', 1): 2}

В общем, вам следует избегать создания переменного числа переменных.Словарь позволяет эффективно извлекать значения, например, с помощью d[('F', 0)] для женского пола и показывает 0.


Но если вы действительно должны использовать map, вы можете использоватьpd.Index.map версия:

d = df.groupby(['Gender', 'Showed']).size()

res = df.drop_duplicates()
res['Counts'] = res.set_index(['Gender', 'Showed']).index.map(d.get)

print(res)

  Gender  Showed  Counts
0      M       0       1
1      M       1       2
3      F       0       2
5      F       1       1
0 голосов
/ 28 сентября 2018

Это похоже на случай crosstab (это встроенная функция: D)

import pandas as pd
df = pd.DataFrame([['M', 0], ['M', 1], ['M', 1], ['F', 0], ['F', 0], ['F', 1]],
                  columns=['Gender', 'Showed'])

pd.crosstab(df.Gender, df.Showed)

Вывод:

Showed  0  1
Gender      
F       2  1
M       1  2
0 голосов
/ 28 сентября 2018

Вы можете сделать это в 4 простых строки.

male0 = ((df['Gender'] == 'M') & (df['Showed'] == 0)).sum()
female0 = ((df['Gender'] == 'F') & (df['Showed'] == 0)).sum()
male1 = ((df['Gender'] == 'M') & (df['Showed'] == 1)).sum()
female1 = ((df['Gender'] == 'F') & (df['Showed'] == 1)).sum()

Используя apply, так как вам нужно две серии, а не одна, вам нужно использовать apply.

male0 = df[['Gender', 'Showed']].apply(lambda row: row['Gender'] == 'M' and row['Showed'] == 0, axis=1).sum() 
female0 = df[['Gender', 'Showed']].apply(lambda row: row['Gender'] == 'F' and row['Showed'] == 0, axis=1).sum() 
male1 = df[['Gender', 'Showed']].apply(lambda row: row['Gender'] == 'M' and row['Showed'] == 1, axis=1).sum() 
female1 = df[['Gender', 'Showed']].apply(lambda row: row['Gender'] == 'F' and row['Showed'] == 1, axis=1).sum() 

Использование groupby

counts = df.groupby(['Gender', 'Showed']).size().reset_index(name='Count')   
...