如何将一个热编码数据帧转换为篮子稀疏矩阵

时间:2019-05-23 14:45:32

标签: python pandas

我想将一个热编码的数据帧转换为篮子稀疏矩阵。

我有这个:

df
Ticket Number  Water  Orange  Lemon  Strawb.  Peach  Book  Pen
5001           0      0      0     0       1     1    0
5002           1      1      0     0       1     1    0
5003           1      0      0     0       0     0    0

我想要这个:

df
Ticket Number 
5001           Peach, Book
5002           Water, Orange, Peach, Book
5003           Water

我在这里尝试了一些想法:

Pivoting a One-Hot-Encode Dataframe

但是我自己却无法提出解决方案。

一些帮助将不胜感激。谢谢

This is how the dataframe actually looks like

2 个答案:

答案 0 :(得分:2)

将“票号”设置为索引后,您可以使用DataFrame.dot

u = df.set_index('Ticket Number')
u.dot(u.columns+',').str.rstrip(',')

Ticket Number
5001                 Peach,Book
5002    Water,Orange,Peach,Book
5003                      Water
dtype: object

或者,

u.dot(u.columns+',').str[:-1].reset_index(name='Items')

   Ticket Number                    Items
0           5001               Peach,Book
1           5002  Water,Orange,Peach,Book
2           5003                    Water

同一事物的更强大版本:

u = df.set_index('Ticket Number').select_dtypes([np.number])
u = u.fillna(0, downcast='infer').clip(lower=0, upper=1)
u.dot(u.columns+',').str[:-1]

Ticket Number
5001                 Peach,Book
5002    Water,Orange,Peach,Book
5003                      Water
dtype: object

答案 1 :(得分:2)

很远

df.melt('TicketNumber').loc[lambda x :x['value']==1].groupby('TicketNumber').variable.agg(','.join)
Out[746]: 
TicketNumber
5001                 Peach,Book
5002    Water,Orange,Peach,Book
5003                      Water
Name: variable, dtype: object