在Python中只将一行更改为列

时间:2018-06-05 13:58:14

标签: python-3.x pandas group-by

所以数据框是

computer status   count
   A       on      45
           off     44
   B       on      34
           off     32
           rmt_off 12
   C       on      23
           off     23
           rmt_off 2

我进行了

df.set_index('status').T

给了我

status     on   off   on   off   rmt_off   on   off   rmt_off
computer   A          B                   C
Count      45   45    34   32    12        23   23    2

预期产出:

Computer   On   off   Rmt_off 
  A        45   45     NaN
  B        34   32     12
  C        23   23     2

如何使值显示如下? 有没有内置功能?

3 个答案:

答案 0 :(得分:3)

如果MultiIndex一列DataFrame

,请使用unstack
print (df.index)
MultiIndex(levels=[['A', 'B', 'C'], ['off', 'on', 'rmt_off']],
           labels=[[0, 0, 1, 1, 1, 2, 2, 2], [1, 0, 1, 0, 2, 1, 0, 2]],
           names=['computer', 'status'])

print (df['count'].unstack())
status     off    on  rmt_off
computer                     
A         44.0  45.0      NaN
B         32.0  34.0     12.0
C         23.0  23.0      2.0

编辑:需要使用正向填充将空字符串替换为NaN,最后一次使用pivot

df['computer'] = df['computer'].mask(df['computer'] == '').ffill()
df = df.pivot('computer','status', 'count')

答案 1 :(得分:2)

尝试按replaceffill修复您的数据框,然后我们可以将pivot应用于原始df,将长格式更改为宽

df=df.replace('',np.nan).ffill()
df.pivot(*df.columns)
Out[437]: 
status     off    on  rmt_off
computer                     
A         44.0  45.0      NaN
B         32.0  34.0     12.0
C         23.0  23.0      2.0

答案 2 :(得分:0)

尝试df.unstack(level = 1)。

df.unstack(level=1) Out[84]: count
off on A NaN NaN B NaN NaN C NaN NaN