将df重塑为多索引并沿键连接

时间:2017-10-11 06:00:58

标签: python pandas dataframe

我有一个名为" df1":

的数据框
            0     1      2      
2015-10-13  96    97.0   59.0   
2008-03-18  90    91.0   92.0   

并希望将其重塑为:

             0         
2015-10-13   96   
             97.0    
             59.0   

2008-03-18   90   
             91.0    
             92.0   

此外,我还有第二个名为" df2" ,它与df1具有相同的索引,但值不同,我想在每个键上连接它们以得到这样的最终输出:

             0        1    
2015-10-13   96       93
             97.0     105
             59.0     123

2008-03-18   90       26
             91.0     36
             92.0     45

3 个答案:

答案 0 :(得分:2)

如果您在索引中有额外的级别,那么这应该可以帮助您:

import pandas

data = {'0': {'2008-03-18': 90, '2015-10-13': 96},
        '1': {'2008-03-18': 91.0, '2015-10-13': 97.0},
        '2': {'2008-03-18': 92.0, '2015-10-13': 59.0}}

df1 = pandas.DataFrame(data)
df2 = df1

result = pandas.concat([df1.stack(), df2.stack()], axis=1)

结果是

                 0     1
2008-03-18 0  90.0  90.0
           1  91.0  91.0
           2  92.0  92.0
2015-10-13 0  96.0  96.0
           1  97.0  97.0
           2  59.0  59.0

正如@cᴏʟᴅsᴘᴇᴇᴅ在评论中所提到的,您可以通过使用

来消除索引中的额外级别
flat_result = result.reset_index(level=1, drop=True)

答案 1 :(得分:2)

您可以使用concat按参数keys + stack定义新列名:

df3 = pd.concat([df1, df2], axis=1, keys=(0,1)).stack()
#data borrowed from another answer
print (df3)

                 0     1
2008-03-18 0  90.0  90.0
           1  91.0  91.0
           2  92.0  92.0
2015-10-13 0  96.0  96.0
           1  97.0  97.0
           2  59.0  59.0
df3 = pd.concat([df1, df2], axis=1, keys=('a','b')).stack()
print (df3)

                 a     b
2008-03-18 0  90.0  90.0
           1  91.0  91.0
           2  92.0  92.0
2015-10-13 0  96.0  96.0
           1  97.0  97.0
           2  59.0  59.0

要删除第二级索引,请添加reset_index

df3 = pd.concat([df1, df2], axis=1, keys=(0,1)).stack().reset_index(level=1, drop=True)
print (df3)

               0     1
2008-03-18  90.0  90.0
2008-03-18  91.0  91.0
2008-03-18  92.0  92.0
2015-10-13  96.0  96.0
2015-10-13  97.0  97.0
2015-10-13  59.0  59.0

答案 2 :(得分:2)

您可以将列表理解传递给gci 'C:\temp\stack' | Rename-Item -NewName {$_.Name -replace ':','.' } -whatIf 。然后将结果传递给numpy.column_stack

pd.DataFrame