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

时间:2014-05-20 17:12:40

标签: python pandas indexing dataframe

我想知道我是否可能错过了一种简单的方法来将一组列名作为数据框中的索引。

以下是我使用当前(杂乱)解决方案设置的示例代码:

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将它们全部加在一起,基于3维索引,以便找到它们的交集(即结果)。

为了做到这一点,我想为什么不将数据集转换为Pandas数据帧,然后将索引设置为3维。然后如上所示它应该是一个简单的乘法工作,熊猫将负责其余的工作。

但是,数据的格式为df1 / df2。因此,上面的代码突出了我将数据转换为带有3个索引的Pandas数据帧的混乱尝试。因此,再次想知道是否有更简单的方法将一组列名称移动到索引中。

谢谢!

1 个答案:

答案 0 :(得分: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