在问这里之前尝试了很多事情。感谢任何帮助。
我有两个数据框,它们是我想要合并在一起的聚合函数的产物,并且能够根据多索引级别对它们进行排序。
以下是这样的:
Serial year quarter min median mean max
0 #474331000 2014 2 2350000 2350000 2.350000e+06 2350000
1 #484110AD1 2014 2 185000 185000 1.850000e+05 185000
2 #484114BA0 2014 2 126000 126000 1.260000e+05 126000
Serial year quarter min median mean max
0 #484118020 2015 1 100 100 100 100
1 #484119AF0 2015 1 160000 165250 165250 170500
2 #484121AG0 2015 1 120000 120000 120000 120000
我想将它们合并在一起以获得类似的内容:
y2014 y2014 y2014 y2015 y2015 y2015
2q 2q 2q 1q 1q 1q
min median mean median mean min
Serials
#3843442115 600 1,148 1,171 2,100 364 40
#5243420535 1,100 1,375 1,359 1,650 169 33
#0843451718 1,100 1,450 1,429 1,750 178 27
#7442431510 750 950 975 1,200 112 24
#7443431921 775 925 972 1,300 155 23
#7442431323 700 950 925 1,100 97 21
最终,我希望能够按公制,年份,季度选择结果,并绘制他们随时间变化的情况。
目前数据框上有一个简单的索引,我认为用上面标有的年份和季度标签标记每个列可能需要也可能不需要多索引。
设置索引后,我找不到合并数据帧的方法来提供所需的结果。
有人可以指出我正确的方向,以帮助我合并,查询和排序(年,季度,公制)多指数水平的数据框架?
谢谢
答案 0 :(得分:0)
一种解决方案是只设置列名称,您将在上面的表单中使用它们。
result.columns=[['year']*6,['quarter']*6,['min','median','mean','max','std','count']]
稍后您可以根据这些列名进行切片。
答案 1 :(得分:0)
你走了:
基于您的数据的原始输入:
>>> df1
Serial year quarter min median mean max
0 #474331000 2014 2 2350000 2350000 2350000.0 2350000
1 #484110AD1 2014 2 185000 185000 185000.0 185000
2 #484114BA0 2014 2 126000 126000 126000.0 126000
>>> df2
Serial year quarter min median mean max
0 #484118020 2015 1 100 100 100 100
1 #484119AF0 2015 1 160000 165250 165250 170500
2 #484121AG0 2015 1 120000 120000 120000 120000
将它们转换为您正在寻找的多索引列
>>> df1_transformed = df1.set_index(['Serial', 'year', 'quarter']).unstack().unstack()
>>> df2_transformed = df2.set_index(['Serial', 'year', 'quarter']).unstack().unstack()
>>> df1_transformed
min median mean max
quarter 2 2 2 2
year 2014 2014 2014 2014
Serial
#474331000 2350000 2350000 2350000.0 2350000
#484110AD1 185000 185000 185000.0 185000
#484114BA0 126000 126000 126000.0 126000
>>> df2_transformed
min median mean max
quarter 1 1 1 1
year 2015 2015 2015 2015
Serial
#484118020 100 100 100 100
#484119AF0 160000 165250 165250 170500
#484121AG0 120000 120000 120000 120000
您可以使用df1_transformed.reorder_levels([2,1,0], axis=1)
来获取您喜欢的列索引的顺序,但为了简单起见,我将其留下。
最后将它们结合起来:
>>> final = pd.concat([df1_transformed, df2_transformed], axis=1)
>>> final
min median mean max min median \
quarter 2 2 2 2 1 1
year 2014 2014 2014 2014 2015 2015
#474331000 2350000.0 2350000.0 2350000.0 2350000.0 NaN NaN
#484110AD1 185000.0 185000.0 185000.0 185000.0 NaN NaN
#484114BA0 126000.0 126000.0 126000.0 126000.0 NaN NaN
#484118020 NaN NaN NaN NaN 100.0 100.0
#484119AF0 NaN NaN NaN NaN 160000.0 165250.0
#484121AG0 NaN NaN NaN NaN 120000.0 120000.0
mean max
quarter 1 1
year 2015 2015
#474331000 NaN NaN
#484110AD1 NaN NaN
#484114BA0 NaN NaN
#484118020 100.0 100.0
#484119AF0 165250.0 170500.0
#484121AG0 120000.0 120000.0
由于您的原始输入数据没有重叠的序列号,因此最终矩阵有许多NaN
s。如果它们的序列号重叠,则NaN
将被填充。