我们可以将panel理解成是多个DataFrame的层叠,每个DataFrame的名称对应为Panel的Minor_axis, 对于每一层的DataFrame而言, DataFrame的index为pandel的Major_aixs, DataFram的keys为panel的Items, 聚宽上读取的股票行情数据就是Panel格式的.
p1 = pd.DataFrame({'stock1':[1,2,3,4], 'stock2':[2,3,4,5]}, index=['2010','2011','2012','2013'])
p2 = pd.DataFrame({'stock1':[2,3,4,5], 'stock2':[3,4,5,6]}, index=['2010','2011','2012','2013'])
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 2 (minor_axis)
Items axis: item1 to item2
Major_axis axis: 2010 to 2013
Minor_axis axis: stock1 to stock2
我们想要得到两个dataframe的最大值,类似下面的结果, 其中每个值取的是最大值
stock1 stock2
2010 2 3
2011 3 4
2012 4 5
2013 5 6
func = lambda x: x[0] if x[0] >= x[1] else x[1]
re_df = pd.DataFrame()
# 提取minor_axis维数据, 比较完成之后重新构建一个dataframe
for i in pn.minor_axis:
re_df[i] = pn.minor_xs(i).apply(func, axis=1)
stock1 stock2
2010 2 3
2011 3 4
2012 4 5
2013 5 6
multiindex
但是最近在使用pannel的时候,系统提示Panel结构在未来会被弃用, 建议使用DataFrame的MultiIndex代替,详细warning如下:
/opt/conda/lib/python3.6/site-packages/jqresearch/api.py:87: FutureWarning:
Panel is deprecated and will be removed in a future version.
The recommended way to represent these types of 3-dimensional data are with a MultiIndex on a DataFrame, via the Panel.to_frame() method
Alternatively, you can use the xarray package http://xarray.pydata.org/en/stable/.
Pandas provides a `.to_xarray()` method to help automate this conversion.
pandasde multiindex比Panel更加直观, 易于展示.
multiindex创建比较简单, 只要将DataFrame中的某两列指定为index即可.
df1 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'分值':[90,50,100,60]})
df2 = df1.set_index(['课程','得分'])
课程 得分 分值
0 语文 最高 90
1 语文 最低 50
2 数学 最高 100
3 数学 最低 60
课程 得分
语文 最高 90
最低 50
数学 最高 100
最低 60
同样还可以使用DataFrame.stack和unstack来操作mutiindex
DataFrame.reset_index(), 可以将multimindex转换成单个dataframe
两个index互换可以通过DataFrame.swaplevel
索引内部排序, DataFrame.sortlevel
合并两个multiindex
df1 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'分值':[90,50,100,60]})
df2 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'属性':[9,5,10,6]})
df3 = df1.set_index(['课程','得分'])
df4 = df2.set_index(['课程','得分'])
df5 = pd.merge(df3, df4, left_index=True, right_index=True, how='inner')