合并不同周期频率的熊猫数据帧

时间:2019-09-22 06:01:50

标签: python pandas dataframe

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

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

1 个答案:

答案 0 :(得分:1)

首先用axis=1 concat,然后在以后需要处理时将列名转换为字符串:

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')])
  

不兼容的频率:输入的频率与期间的频率(Aeq)(频率等于Q-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