Python 跨包含数据帧的字典聚合

Python 跨包含数据帧的字典聚合,python,pandas,dictionary,Python,Pandas,Dictionary,我有下面的字典,其中包含作为值的数据帧,每个数据帧总是具有相同标题的相同列数(1) test = {'A': pd.DataFrame(np.random.randn(10), index=range(10),columns=['values']), 'B': pd.DataFrame(np.random.randn(6), index=range(6),columns=['values']), 'C': pd.DataFrame(np.random.randn(

我有下面的字典,其中包含作为值的数据帧,每个数据帧总是具有相同标题的相同列数(1)

test = {'A': pd.DataFrame(np.random.randn(10), index=range(10),columns=['values']),
        'B': pd.DataFrame(np.random.randn(6), index=range(6),columns=['values']),
        'C': pd.DataFrame(np.random.randn(11), index=range(11),columns=['values'])}
由此,我想创建一个数据帧,其中索引值是字典的键值(因此a、B、C),列是所有字典中当前索引值的并集(因此在本例中为0,1,2,3…10)。此数据框的值将是对应于每行的数据框中的相应“值”,如果为空,则为NaN


有没有简便的方法可以做到这一点?

IIUC,使用
pd.concat
,和
取消堆叠

pd.concat([test[i] for i in test], keys=test.keys()).unstack(1)['values']
更好的是

pd.concat(test).unstack(1)['values']
输出:

         0         1         2         3         4         5         6   \
A -0.029027 -0.530398 -0.866021  1.331116  0.090178  1.044801 -1.586620   
C  1.320105  1.244250 -0.162734  0.942929 -0.309025 -0.853728  1.606805   
B -1.683822  1.015894 -0.178339 -0.958557 -0.910549 -1.612449       NaN   

         7         8         9         10  
A -1.072210  1.654565 -1.188060       NaN  
C  1.642461 -0.137037 -1.416697 -0.349107  
B       NaN       NaN       NaN       NaN

不要把事情复杂化: 只需使用concat和transpose

pd.concat(test, axis=1).T

                0         1         2         3         4         5   \
A values -0.592711  0.266518 -0.774702  0.826701 -2.642054 -0.366401   
B values -0.709410 -0.463603  0.058129 -0.054475 -1.060643  0.081655   
C values  1.384366  0.662186 -1.467564  0.449142 -1.368751  1.629717   
                6         7         8         9         10  
A values  0.431069  0.761245 -1.125767  0.614622       NaN  
B values       NaN       NaN       NaN       NaN       NaN  
C values  0.988287 -1.508384  0.214971 -0.062339 -0.011547  
如果您处理的是系列而不是1列数据帧,那么从

test = {'A': pd.Series(np.random.randn(10), index=range(10)),
        'B': pd.Series(np.random.randn(6), index=range(6)),
        'C': pd.Series(np.random.randn(11), index=range(11))}

pd.concat(test,axis=1).T
         0         1         2         3         4         5         6   \
A -0.174565 -2.015950  0.051496 -0.433199  0.073010 -0.287708 -1.236115   
B  0.935434  0.228623  0.205645 -0.602561  1.860035 -0.921963       NaN   
C  0.944508 -1.296606 -0.079339  0.629038  0.314611 -0.429055 -0.911775   
         7         8         9         10  
A -0.704886 -0.369263 -0.390684       NaN  
B       NaN       NaN       NaN       NaN  
C  0.815078  0.061458  1.726053 -0.503471  

您需要
pd.concat
您的预期输出是什么?看起来不错。我认为您可以不使用concat()的第一个参数中的列表理解。事实上,所需的输出看起来是通过:pd.concat(test).unstack(1)['values']@laszlopanaflex实现的。你说得太对了。我讨厌过度思考/忽视简单的东西。@laszlopanaflex-超级解决方案,别忘了upvote;)