Python 跨包含数据帧的字典聚合
我有下面的字典,其中包含作为值的数据帧,每个数据帧总是具有相同标题的相同列数(1)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(
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;)