熊猫-更新值序列

时间:2018-09-20 18:09:36

标签: python python-3.x pandas

我有这个示例数据框:

pd.DataFrame(data={1:[0,3,4,1], 2:[4,1,0,0], 3:[0,0,1,2], 4:[1,2,3,4] })

   1  2  3  4
0  0  4  0  1
1  3  1  0  2
2  4  0  1  3
3  1  0  2  4

但是我想将其转换为以下格式:

pd.DataFrame(data={1:[1,1,1,1], 2:[0,2,0,2], 3:[0,3,3,0], 4:[4,0,4,4] })

   1  2  3  4
0  1  0  0  4
1  1  2  3  0
2  1  0  3  4
3  1  2  0  4

有什么方法或功能可以做到这一点,因为我有超过100,000行,因此对于循环,字典,列表来说行不通。

3 个答案:

答案 0 :(得分:3)

我的条目:

data = df.reset_index().melt("index").query("value > 0")
out = data.pivot("index", "value", "value").fillna(0).astype(int)

给予

In [273]: out
Out[273]: 
value  1  2  3  4
index            
0      1  0  0  4
1      1  2  3  0
2      1  0  3  4
3      1  2  0  4

不幸的是,如果您想使用df.index.name = df.columns.name = Nonedf.rename_axis(None).rename_axis(None, 1)之类的东西来删除索引和列名,则必须清除它们。

答案 1 :(得分:2)

使用get_dummies

s = pd.get_dummies(df, columns=df.columns, prefix_sep='', prefix='')
out = s.groupby(s.columns, axis=1).sum().drop('0', 1)
out.mask(out.ne(0)).fillna(dict(zip(out.columns, out.columns))).astype(int)

   1  2  3  4
0  1  0  0  4
1  1  2  3  0
2  1  0  3  4
3  1  2  0  4

答案 2 :(得分:2)

使用zipnp.isin

pd.DataFrame([ np.isin(y, x)*df.columns.values for x , y in zip([df.columns.values]*len(df),df.values)])
Out[900]: 
   0  1  2  3
0  0  2  0  4
1  1  2  0  4
2  1  0  3  4
3  1  0  3  4