我想将一个热编码的数据帧转换为篮子稀疏矩阵。
我有这个:
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
但是我自己却无法提出解决方案。
一些帮助将不胜感激。谢谢
答案 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