Преобразуйте значения ячеек в заголовки столбцов и заполните их 1, если они совпадают в Python - PullRequest
1 голос
/ 20 сентября 2019

У меня есть фрейм данных:

df
ID 0   1   2    3  4 .... 
1  10  20  5    1  2 ....
2  3   4   NaN    10 1 ....

И мне нужно переместить значения ячеек столбца 0,1,2,3,4... в заголовки столбцов и заполнить их для идентификаторов 1, если значение ячейки присутствуетдля соответствующего идентификатора.

Требуемый вывод:

ID 1 2 3 4 5 ... 10 20 ..
1  1 1 0 0 1 ... 1  1  ..
2  1 0 1 1 0 ... 1  0  ..

Обратите внимание, что некоторые записи могут быть NaN.

Как получить желаемый вывод?

Ответы [ 2 ]

3 голосов
/ 20 сентября 2019

Используйте DataFrame.set_index с DataFrame.stack для удаления пропущенных значений, затем создайте индикаторы с помощью get_dummies и верните 1/0 с помощью maxпо первому уровню последние столбцы преобразуются в целые числа:

df1 = (pd.get_dummies(df.set_index('ID').stack())
         .max(level=0)
         .rename(columns=int)
         .reset_index())
print (df1)
   ID  1  2  3  4  5  10  20
0   1  1  1  0  0  1   1   1
1   2  1  0  1  1  0   1   0

РЕДАКТИРОВАТЬ:

print (df)
   ID   0   1    2   3  4  5
0   1  10  20  5.0   1  2  5
1   2   3   4  NaN  10  1  2

Если использовать max, то всегда в выходных значения 0/1 значения (проверьте столбец 5):

df1 = (pd.get_dummies(df.set_index('ID').stack())
         .max(level=0)
         .rename(columns=int)
         .reset_index())
print (df1)
   ID  1  2  3  4  5  10  20
0   1  1  1  0  0  1   1   1
1   2  1  1  1  1  0   1   0

Но если использовать sum, он считает значения (отметьте 5 столбец):

df2 = (pd.get_dummies(df.set_index('ID').stack())
         .sum(level=0)
         .rename(columns=int)
         .reset_index())
print (df2)
   ID  1  2  3  4  5  10  20
0   1  1  1  0  0  2   1   1
1   2  1  1  1  1  0   1   0
1 голос
/ 20 сентября 2019

Другой способ использования melt и pd.crosstab

df1 = df.melt('ID')
df_final =  pd.crosstab(index=df1.ID, columns=df1.value).reset_index()

Out[673]:
value  ID  1.0  2.0  3.0  4.0  5.0  10.0  20.0
0      1   1    1    0    0    1    1     1
1      2   1    0    1    1    0    1     0

Примечание : при подсчете по умолчанию pd.crosstab используется частота.Следовательно, повторяющиеся значения будут учитываться как их частоты.Если вам нужен только индикатор 1/0, просто соедините ge(1) и astype следующим образом

pd.crosstab(index=df1.ID, columns=df1.value).ge(1).astype(int).reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...