假设我有以下两个数据框:
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
答案 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