我有像这样的daraframe
df = pd.DataFrame({'id1':[1,1,1,1,2,2,2],'id2':[1,1,1,1,2,2,2],'value':['a','b','c','d','a','b','c']})
id1 id2 value
0 1 1 a
1 1 1 b
2 1 1 c
3 1 1 d
4 2 2 a
5 2 2 b
6 2 2 c
我需要转换成这种形式
id1 id2 a b c d
0 1 1 1 1 1 1
1 2 2 1 1 1 0
每个id的值变量中可以有任意数量的级别,范围从1到10.如果该ID不存在该级别,则应为0,否则为1。
我正在使用anaconda python 3.5,windows 10
答案 0 :(得分:4)
如果需要输出1
和0
仅出现value
:
您可以将get_dummies
与set_index
创建的Series
一起使用,但必须groupby
+ GroupBy.max
:
df = pd.get_dummies(df.set_index(['id1','id2'])['value'])
.groupby(level=[0,1])
.max()
.reset_index()
print (df)
id1 id2 a b c d
0 1 1 1 1 1 1
1 2 2 1 1 1 0
使用groupby
,size
和unstack
的另一个解决方案,但随后与gt
进行比较,并由astype
转换为int
。上次reset_index
和rename_axis
:
df = df.groupby(['id1','id2', 'value'])
.size()
.unstack(fill_value=0)
.gt(0)
.astype(int)
.reset_index()
.rename_axis(None, axis=1)
print (df)
id1 id2 a b c d
0 1 1 1 1 1 1
1 2 2 1 1 1 0
如果需要计算value
s:
df = pd.DataFrame({'id1':[1,1,1,1,2,2,2],
'id2':[1,1,1,1,2,2,2],
'value':['a','b','a','d','a','b','c']})
print (df)
id1 id2 value
0 1 1 a
1 1 1 b
2 1 1 a
3 1 1 d
4 2 2 a
5 2 2 b
6 2 2 c
df = df.groupby(['id1','id2', 'value'])
.size()
.unstack(fill_value=0)
.reset_index()
.rename_axis(None, axis=1)
print (df)
id1 id2 a b c d
0 1 1 2 1 0 1
1 2 2 1 1 1 0
或者:
df = df.pivot_table(index=['id1','id2'], columns='value', aggfunc='size', fill_value=0)
.reset_index()
.rename_axis(None, axis=1)
print (df)
id1 id2 a b c d
0 1 1 2 1 0 1
1 2 2 1 1 1 0