Pandas DataFrame: Как преобразовать числовые столбцы в попарно категоричные данные? - PullRequest
2 голосов
/ 20 марта 2019

Учитывая pandas dataFrame, как преобразовать несколько числовых столбцов (где x ≠ 1 означает, что значение существует, x = 0 означает, что оно не существует) в попарно категоричный фрейм данных?Я знаю, что это похоже на одно горячее декодирование, но столбцы не совсем одного горячего.

Пример:

 df
id A  B  C  D
0  3  0  0  1
1  4  1  0  0
2  1  7  20 0
3  0  0  0  4
4  0  0  0  0
5  0  1  0  0

Результат будет: df id match

 result 
0  A
0  D 
1  A
1  B
2  A
2  B
2  C
3  D
5  B

1 Ответ

1 голос
/ 20 марта 2019

Использование DataFrame.stack с фильтрацией и Index.to_frame:

s = df.stack()

df = s[s!=0].index.to_frame(index=False).rename(columns={1:'result'})
print (df)
   id result
0   0      A
1   0      D
2   1      A
3   1      B
4   2      A
5   2      B
6   2      C
7   3      D
8   5      B

Или, если важна производительность, используйте numpy.where для индексов по сопоставленным значениям с конструктором DataFrame:

i, c = np.where(df != 0)

df = pd.DataFrame({'id':df.index.values[i],
                   'result':df.columns.values[c]})
print (df)
   id result
0   0      A
1   0      D
2   1      A
3   1      B
4   2      A
5   2      B
6   2      C
7   3      D
8   5      B

EDIT:

Для первого:

s = df.stack()

df = s[s!=0].reset_index()
df.columns= ['id','result','vals']
print (df)
   id result  vals
0   0      A     3
1   0      D     1
2   1      A     4
3   1      B     1
4   2      A     1
5   2      B     7
6   2      C    20
7   3      D     4
8   5      B     1

Для второго:

df = pd.DataFrame({'id':df.index.values[i],
                   'result':df.columns.values[c],
                   'vals':df.values[i,c]})
...