将pandas行值转换为列标题

5
我有一个数据框架,像这样:

</ p>

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。


1
如果将 2 1 1 c 更改为 2 1 1 a,输出结果是什么? - jezrael
抱歉造成困惑。我的意思是每个值只会有一个实例。也就是说,对于每个ID,只会有一个'a'。我只需要用二进制值来检查它们的存在。此外,id1和id2将完全相同。 - Gowtham M
1
好的,前两个解决方案都是针对您的。 - jezrael
请问你能帮我处理这种情况吗?例如,如果我需要获取数量,比如将 2 1 1 c 更改为 2 1 1 a,我需要获取计数。 - Gowtham M
1个回答

5
如果只需要判断是否存在value,则可以使用由set_index创建的Seriesget_dummies一起使用,但是接下来需要使用groupbyGroupBy.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

使用groupbysizeunstack的另一个解决方案,但接下来需要与gt进行比较,并通过astype转换为int。最后reset_indexrename_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,则:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接