结合不同周期频率的 Pandas 数据帧

假设我有以下两个数据框:


np.random.seed(1)

annual = pd.DataFrame(data=np.random.random((2, 4)), index=index, columns=pd.period_range(start="2015", end="2018", freq="Y"))

quarterly = pd.DataFrame(data=np.random.random((2,3)), index=index, columns=pd.period_range('2019', freq='Q', periods=3))

Annual:


    2015        2016        2017        2018

A   0.417022    0.720324    0.000114    0.302333

B   0.146756    0.092339    0.186260    0.345561

Quarterly:


    2019Q1      2019Q2      2019Q3

A   0.396767    0.538817    0.419195

B   0.685220    0.204452    0.878117

是否有可能我将两个数据框组合在一起,以便生成的数据框df如下所示?如果没有,是否有允许我合并两个数据框的解决方法,以便我可以执行类似的操作df['2019Q2'] - df['2018']?


    2015        2016        2017        2018        2019Q1      2019Q2      2019Q3

A   0.417022    0.720324    0.000114    0.302333    0.396767    0.538817    0.419195   

B   0.146756    0.092339    0.186260    0.345561    0.685220    0.204452    0.878117



HUX布斯
浏览 104回答 1
1回答

MM们

如果稍后需要处理,首先需要将列名转换为concat字符串:axis=1df = pd.concat([annual,quarterly], axis=1).rename(columns=str)print (df)       2015      2016      2017      2018    2019Q1    2019Q2    2019Q3A  0.417022  0.720324  0.000114  0.302333  0.396767  0.538817  0.419195B  0.146756  0.092339  0.186260  0.345561  0.685220  0.204452  0.878117print (df.columns)Index(['2015', '2016', '2017', '2018', '2019Q1', '2019Q2', '2019Q3'], dtype='object')print (df['2019Q2'] - df['2018'])A    0.236484B   -0.141108dtype: float64如果想使用句点,有可能,但更复杂:df = pd.concat([annual,quarterly], axis=1)print (df)       2015      2016      2017      2018    2019Q1    2019Q2    2019Q3A  0.417022  0.720324  0.000114  0.302333  0.396767  0.538817  0.419195B  0.146756  0.092339  0.186260  0.345561  0.685220  0.204452  0.878117print (df[pd.Period('2018', freq='A-DEC')])A    0.302333B    0.345561Name: 2018, dtype: float64print (df[pd.Period('2019Q2', freq='Q-DEC')])A    0.538817B    0.204452Name: 2019Q2, dtype: float64print (df[pd.Period('2019Q2', freq='Q-DEC')] -        df[pd.Period('2018', freq='A-DEC')])IncompatibleFrequency:输入与 Period(freq=Q-DEC) 具有不同的 freq=A-DEC更改名称Series以防止错误:print (df[pd.Period('2019Q2', freq='Q-DEC')].rename('a') -        df[pd.Period('2018', freq='A-DEC')].rename('a'))A    0.236484B   -0.141108Name: a, dtype: float64在我看来,如果需要处理后Periods最好的值,则以相同的频率工作:annual.columns = annual.columns.to_timestamp('Q').to_period('Q')df = pd.concat([annual,quarterly], axis=1)print (df)     2015Q1    2016Q1    2017Q1    2018Q1    2019Q1    2019Q2    2019Q3A  0.417022  0.720324  0.000114  0.302333  0.396767  0.538817  0.419195B  0.146756  0.092339  0.186260  0.345561  0.685220  0.204452  0.878117print (df[pd.Period('2019Q2', freq='Q-DEC')] -        df[pd.Period('2018Q1', freq='Q-DEC')])A    0.236484B   -0.141108dtype: float64
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python