Преобразование в бинарные переменные с использованием pandas python - PullRequest
0 голосов
/ 03 июля 2018

Я все еще новичок в pivot_table панд Python, и я пытаюсь изменить данные, чтобы получить двоичный индикатор, если значение находится в определенном наблюдении. Я следовал некоторым предыдущим кодам и получил некоторые обнадеживающие результаты, однако вместо 1 и нулей, как это мой идеальный результат, я получаю сумму. Пожалуйста, посмотрите небольшой образец данных, приведенный ниже

    ID          SKILL     NUM
    1             A        1
    1             A        1
    1             B        1
    2             C        1
    3             C        1
    3             C        1
    3             E        1

Результаты, к которым я стремлюсь:

    ID    A         B        C    E
    1     1         1        0    0
    2     0         0        1    0
    3     0         0        0    1

Мой код atm получит следующий результат:

    ID    A         B        C    E
    1     2         1        0    0
    2     0         0        2    0
    3     0         0        0    1

Должен ли я сначала удалить дубликаты ??

Код, который я использую atm, находится ниже;

  df_pivot =  df2.pivot_table(index='Job_posting_ID', columns='SKILL', aggfunc=len, fill_value=0)

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Вы можете использовать aggfunc='any' и конвертировать в int как отдельный шаг. Это избавляет от необходимости использовать lambda / пользовательскую функцию и может быть более эффективным.

df_pivot =  df.pivot_table(index='ID', columns='SKILL',
                           aggfunc='any', fill_value=0).astype(int)

print(df_pivot)

      NUM         
SKILL   A  B  C  E
ID                
1       1  1  0  0
2       0  0  1  0
3       0  0  1  1

То же самое будет работать с aggfunc=len + преобразованием в int, за исключением того, что это, вероятно, будет дороже.

0 голосов
/ 03 июля 2018

Вы можете использовать get_dummies с set_index для столбцов индикатора, а затем получить max значений для индекса:

df = pd.get_dummies(df.set_index('ID')['SKILL']).max(level=0)

Для повышения производительности удалите дубликаты на drop_duplicates и измените их на set_index с помощью unstack:

df = df.drop_duplicates(['ID','SKILL']).set_index(['ID','SKILL'])['NUM'].unstack(fill_value=0)

Решение с pivot, но затем необходимо заменить NaN s на 0:

df = df.drop_duplicates(['ID','SKILL']).pivot('ID','SKILL','NUM').fillna(0).astype(int)

Если хотите использовать ваше решение, просто удалите дубликаты, но лучше это unstack, потому что данные никогда не агрегируются, потому что не дублируются пары ID с SKILL:

df2 = df.drop_duplicates(['ID','SKILL'])
df_pivot = (df2.pivot_table(index='ID', 
                            columns='SKILL', 
                            values='NUM',
                            aggfunc=len, 
                            fill_value=0))
print (df_pivot)
SKILL  A  B  C  E
ID               
1      1  1  0  0
2      0  0  1  0
3      0  0  1  1
0 голосов
/ 03 июля 2018

Попробуй так:

df.pivot_table(index='ID', columns='SKILL', values='NUM', aggfunc=lambda x: len(x.unique()), fill_value=0)

Или это:

df.pivot_table(index='ID', columns='SKILL',aggfunc=lambda x: int(x.any()), fill_value=0)

В зависимости от того, что вам больше подходит.

...