Как взять разницу соответствия df ['keys'] и создать для них новый столбец - PullRequest
2 голосов
/ 11 марта 2019

Я пытаюсь найти разрыв в заработной плате между полами с учетом набора специальностей.

Вот текстовая версия моей таблицы:

    gender   field group   logwage
0     male      BUSINESS  7.229572
10  female      BUSINESS  7.072464
1     male    COMM/JOURN  7.108538
11  female    COMM/JOURN  7.015018
2     male  COMPSCI/STAT  7.340410
12  female  COMPSCI/STAT  7.169401
3     male     EDUCATION  6.888829
13  female     EDUCATION  6.770255
4     male   ENGINEERING  7.397082
14  female   ENGINEERING  7.323996
5     male    HUMANITIES  7.053048
15  female    HUMANITIES  6.920830
6     male      MEDICINE  7.319011
16  female      MEDICINE  7.193518
17  female        NATSCI  6.993337
7     male        NATSCI  7.089232
18  female         OTHER  6.881126
8     male         OTHER  7.091698
9     male  SOCSCI/PSYCH  7.197572
19  female  SOCSCI/PSYCH  6.968322

diff не работает для меня, так как будет принимать разницу между всеми последовательными мажорами.

и вот код, как сейчас:

for row in sorted_mfield:
   if sorted_mfield['field group']==sorted_mfield['field group'].shift(1):
    diff= lambda x: x[0]-x[1]

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

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Решение с использованием Pandas.DataFrame.shift () в отсортированной версии данных:

df.sort_values(by=['field group', 'gender'], inplace=True)
df['gap'] = df.logwage - df.logwage.shift(1)
df[df.gender =='male'][['field group', 'gap']]

Создание следующего вывода с примерами данных:

    field group     gap
0   BUSINESS        0.157108
2   COMM/JOURN      0.093520
4   COMPSCI/STAT    0.171009
6   EDUCATION       0.118574
8   ENGINEERING     0.073086
10  HUMANITIES      0.132218
12  MEDICINE        0.125493
15  NATSCI          0.095895
17  OTHER           0.210572
18  SOCSCI/PSYCH    0.229250

Примечание: считает, что у вас всегда будет пара значений для каждой группы полей.Если вы хотите проверить его или исключить группы полей без этой пары, приведенный ниже код выполняет фильтрацию:

df_grouped = df.groupby('field group') 
df_filtered = df_grouped.filter(lambda x: len(x) == 2)
2 голосов
/ 11 марта 2019

Я бы рассмотрел изменение формы вашего DataFrame с pivot, чтобы было легче вычислять.

Код:

df.pivot(index='field group', columns='gender', values='logwage').rename_axis([None], axis=1)

#                female      male
#field group                     
#BUSINESS      7.072464  7.229572
#COMM/JOURN    7.015018  7.108538
#COMPSCI/STAT  7.169401  7.340410
#EDUCATION     6.770255  6.888829
#ENGINEERING   7.323996  7.397082
#HUMANITIES    6.920830  7.053048
#MEDICINE      7.193518  7.319011
#NATSCI        6.993337  7.089232
#OTHER         6.881126  7.091698
#SOCSCI/PSYCH  6.968322  7.197572

df.male - df.female

#field group
#BUSINESS        0.157108
#COMM/JOURN      0.093520
#COMPSCI/STAT    0.171009
#EDUCATION       0.118574
#ENGINEERING     0.073086
#HUMANITIES      0.132218
#MEDICINE        0.125493
#NATSCI          0.095895
#OTHER           0.210572
#SOCSCI/PSYCH    0.229250
#dtype: float64
...