Python Pandas:如何将列设置为索引?

1 投票
1 回答
3544 浏览
提问于 2025-04-18 07:07

我在想,是否有更简单的方法可以把一组列名作为索引放进数据框里。

下面是我用现在这个(有点乱的)解决方案写的示例代码:

df1 = pd.DataFrame({
'A' : ['a1', 'a1', 'a2', 'a3'],
'B' : ['b1', 'b2', 'b3', 'b4'],
'D1' : [1,0,0,0],
'D2' : [0,1,1,0],
'D3' : [0,0,1,1],
})

df1 = df1.set_index(['A','B'])
b = df1.unstack().unstack()
c = b.reset_index()
c.columns = ['D','B','A','Value']
d = c.set_index(['A','B','D'])
final1 = d.unstack()

df2 = pd.DataFrame({
'A' : ['a1', 'a1', 'a2', 'a3'],
'B' : ['b1', 'b2', 'b3', 'b4'],
'D1' : [1,0,0,0],
'D2' : [0,0,0,0],
'D3' : [0,0,0,1],
})

df2 = df2.set_index(['A','B'])
b = df2.unstack().unstack()
c = b.reset_index()
c.columns = ['D','B','A','Value']
d = c.set_index(['A','B','D'])
final2 = d.unstack()

result = (final1*final2).dropna()

为了更好地理解背景,我想解决的实际问题是这样的:我有N个数据框(比如df1、df2),里面全是1和0,我想找个办法用Pandas把它们都乘在一起,基于一个三维的索引,来找出它们的交集(也就是结果)。

为此,我想,为什么不把数据集转换成Pandas数据框,然后把索引设置为这三维呢?这样一来,像上面那样就应该只是简单的乘法,Pandas会处理剩下的事情。

可是,数据的格式像df1和df2那样。因此,上面的代码展示了我把数据转换成带有三个索引的Pandas数据框时的混乱尝试。所以,我又在想,是否有更简单的方法可以把一组列名移动到索引里。

谢谢!

1 个回答

1

我觉得你可以把所有的框架放在一个列表里,然后进行合并。这样每次都会对齐;把fill_value设置为1的话,在乘法运算时会把值传递下去,而不是用NaN(我想这正是你想要的效果)。

In [39]: list_of_dfs = [df1,df2]

In [40]: reduce(lambda x,y: x.mul(y,fill_value=1), list_of_dfs[1:], list_of_dfs[0])
Out[40]: 
       D1  D2  D3
A  B             
a1 b1   1   0   0
   b2   0   0   0
a2 b3   0   0   0
a3 b4   0   0   1

撰写回答