我有这样的数据:
user reg ind prod
A Asia Tele TV
A Asia Bank Phone
A Japan Tele Book
B US Fin Paper
B US Data Shop
B Asia Tele TV
B Africa Invest Book
C Asia Tele Paper
C Japan Fin TV
我想将每个列中的类别转换为单独的列,如果它们位于用户下方,则将它们标记为1/0,如下所示:
User Asia Japan US Africa Tele Bank Fin Data Invest TV Phone Book Paper Shop
A 1 1 0 0 1 1 0 0 0 1 1 1 0 0
B 1 0 1 1 1 0 1 1 1 1 0 1 1 1
C 1 1 0 0 1 0 1 0 0 1 0 0 1 0
本质上编码它们以标记它们与每个类别的关联。另外,如果我可以重命名列,使其具有主列,例如“ reg_Asia”等。 我尝试使用Pivot,Pivot_table,Stack,Unstack,但无法做到这一点。
答案 0 :(得分:4)
如果仅希望输出max
,请对get_dummies
和0/1
使用set_index
;如果希望计数值,请使用sum
:
df = pd.get_dummies(df.set_index('user'), prefix='', prefix_sep='').max(level=0).reset_index()
print (df)
user Africa Asia Japan US Bank Data Fin Invest Tele Book Paper \
0 A 0 1 1 0 1 0 0 0 1 1 0
1 B 1 1 0 1 0 1 1 1 1 1 1
2 C 0 1 1 0 0 0 1 0 1 0 1
Phone Shop TV
0 1 0 1
1 0 1 1
2 0 0 1
如果还希望对数据进行分类,请创建MultiIndex
:
df1= pd.get_dummies(df.set_index('user')).max(level=0)
df1.columns = df1.columns.str.split('_', expand=True)
print (df1)
reg ind prod
Africa Asia Japan US Bank Data Fin Invest Tele Book Paper Phone Shop TV
user
A 0 1 1 0 1 0 0 0 1 1 0 1 0 1
B 1 1 0 1 0 1 1 1 1 1 1 0 1 1
C 0 1 1 0 0 0 1 0 1 0 1 0 0 1
print (df1['reg'])
Africa Asia Japan US
user
A 0 1 1 0
B 1 1 0 1
C 0 1 1 0