为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2022-06-02 17:26:10
假设我有以下两个数据框: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        2018A   0.417022    0.720324    0.000114    0.302333B   0.146756    0.092339    0.186260    0.345561Quarterly:    2019Q1      2019Q2      2019Q3A   0.396767    0.538817    0.419195B   0.685220    0.204452    0.878117是否有可能我将两个数据框组合在一起,以便生成的数据框df如下所示?如果没有,是否有允许我合并两个数据框的解决方法,以便我可以执行类似的操作df['2019Q2'] - df['2018']?    2015        2016        2017        2018        2019Q1      2019Q2      2019Q3A   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
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

如果稍后需要处理,首先需要将列名转换为concat字符串:axis=1


df = pd.concat([annual,quarterly], axis=1).rename(columns=str)

print (df)

       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


print (df.columns)

Index(['2015', '2016', '2017', '2018', '2019Q1', '2019Q2', '2019Q3'], dtype='object')


print (df['2019Q2'] - df['2018'])

A    0.236484

B   -0.141108

dtype: float64

如果想使用句点,有可能,但更复杂:


df = pd.concat([annual,quarterly], axis=1)

print (df)

       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


print (df[pd.Period('2018', freq='A-DEC')])

A    0.302333

B    0.345561

Name: 2018, dtype: float64


print (df[pd.Period('2019Q2', freq='Q-DEC')])

A    0.538817

B    0.204452

Name: 2019Q2, dtype: float64

print (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.236484

B   -0.141108

Name: 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    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


print (df[pd.Period('2019Q2', freq='Q-DEC')] - 

       df[pd.Period('2018Q1', freq='Q-DEC')])


A    0.236484

B   -0.141108

dtype: float64


查看完整回答
反对 回复 2022-06-02
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信