几个时间序列转换为数据框。

12

我有一个问题,需要把多个时间序列合并到一个共同的DataFrame中。以下是我使用的示例代码:

import pandas
import datetime
import numpy as np

start = datetime.datetime(2001, 1, 1)
end = datetime.datetime(2001, 1, 10)
dates = pandas.date_range(start, end)
serie_1 = pandas.Series(np.random.randn(10), index = dates)
start = datetime.datetime(2001, 1, 2)
end = datetime.datetime(2001, 1, 11)
dates = pandas.date_range(start, end)
serie_2 = pandas.Series(np.random.randn(10), index = dates)
start = datetime.datetime(2001, 1, 3)
end = datetime.datetime(2001, 1, 12)
dates = pandas.date_range(start, end)
serie_3 = pandas.Series(np.random.randn(10), index = dates)

print 'serie_1'
print serie_1
print 'serie_2'
print serie_2
print 'serie_3'
print serie_3

serie_4 = pandas.concat([serie_1,serie_2], join='outer', axis = 1)
print 'serie_4'
print serie_4
serie_5 = pandas.concat([serie_4, serie_3], join='outer', axis = 1)
print 'serie_5'
print serie_5

这导致我在 serie_5(第二个concat)中出现了错误:

Traceback (most recent call last):
  File "C:\Users\User\Workspaces\Python\Source\TestingPandas.py", line 29, in <module>
    serie_5 = pandas.concat([serie_4, serie_3], join='outer', axis = 1)
  File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 878, in concat
    verify_integrity=verify_integrity)
  File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 948, in __init__
    self.new_axes = self._get_new_axes()
  File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 1101, in _get_new_axes
    new_axes[i] = self._get_comb_axis(i)
  File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 1125, in _get_comb_axis
    all_indexes = [x._data.axes[i] for x in self.objs]
AttributeError: 'TimeSeries' object has no attribute '_data'

我愿意让结果看起来像这样(第二列有随机值):
                 0         1         2
2001-01-01 -1.224602       NaN       NaN
2001-01-02 -1.747710 -2.618369       NaN
2001-01-03 -0.608578 -0.030674 -1.335857
2001-01-04  1.503808 -0.050492  1.086147
2001-01-05  0.593152  0.834805 -1.310452
2001-01-06 -0.156984  0.208565 -0.972561
2001-01-07  0.650264 -0.340086  1.562101
2001-01-08 -0.063765 -0.250005 -0.508458
2001-01-09 -1.092656 -1.589261 -0.481741
2001-01-10  0.640306  0.333527 -0.111668
2001-01-11       NaN -1.159637  0.110722
2001-01-12       NaN       NaN -0.409387

问题出在哪里?就像我说的,可能很基础,但我还是想不出来,因为我是初学者...

1个回答

17

将列表中的Series连接起来会返回一个DataFrame。因此,serie_4是一个DataFrame,而serie_3是一个Series。将DataFrameSeries连接会引发异常。

你可以使用

import pandas as pd
serie_5 = pd.concat([serie_1, serie_2, serie_3], join='outer', axis=1)

取而代之。


例如,
import functools
import numpy as np
import pandas as pd

s1 = pd.Series([0,1], index=list('AB'))
s2 = pd.Series([2,3], index=list('AC'))

result = pd.concat([s1, s2], join='outer', axis=1, sort=False)
print(result)

产量

     0    1
A  0.0  2.0
B  1.0  NaN
C  NaN  3.0

请注意,如果您尝试将一个具有非唯一索引的系列连接起来,则会出现ValueError。例如,
s3 = pd.Series([0,1], index=list('AB'), name='s3')
s4 = pd.Series([2,3], index=list('AA'), name='s4') # <-- non-unique index
result = pd.concat([s3, s4], join='outer', axis=1, sort=False)

引发异常

ValueError: cannot reindex from a duplicate axis

为了解决这个问题,重置索引并合并数据框即可:
import functools   
s3 = pd.Series([0,1], index=list('AB'), name='s3')
s4 = pd.Series([2,3], index=list('AA'), name='s4') # <-- non-unique index

result = functools.reduce(
    lambda left,right: pd.merge(left,right,on='index',how='outer'), 
    [s.reset_index() for s in [s3,s4]])
print(result)

产生。
  index  s3   s4
0     A   0  2.0
1     A   0  3.0
2     B   1  NaN

好的,那么我明白为什么会出现这个错误了。我还测试了通过更改代码将DataFrame与另一个DataFrame连接起来的方法:serie_5 = pandas.concat([serie_4, pandas.DataFrame(serie_3)], join='outer', axis=1。这意味着我可以将两个Series连接到一个DataFrame中,然后将此DataFrame与另一个DataFrame连接起来。我需要找到一种通用的解决方案,在其中可以在循环中添加多个Series,并且我不知道预先的数量。 - Jonas
只需创建一个Python列表,将您的Series附加到其中,然后像@unutbu上面所写的那样提供给pandas.concat。 - K.-Michael Aye
使用join看起来足够通用!我将其更改为"serie_5 = serie_4.join(serie_3, how='outer')",以便在上面的示例中包括2012-01-12。我想要一个通用解决方案的原因是我想要组合几个不同的时间序列,其中将存在缺失数据,并使用Pandas功能处理缺失数据。谢谢! - Jonas
为什么命令 serie_5 = pandas.concat([serie_1, serie_2, serie_3], join='outer', axis=1) 对我的系列不起作用? 它返回错误:无法从重复的轴重新索引 实际上,我的系列(mySeries)和此处使用的系列一样都是_pandas.core.series.Series_, 但我的系列还有第二个规格。您建议我提出另一个问题吗? - SPS
@SPS:至少有一个系列具有非唯一索引。在这种情况下,pd.concat会引发ValueError: cannot reindex from a duplicate axis。为了解决这个问题,将每个系列转换为DataFrame(例如s = s.reset_index()),然后在“index”列上外部合并数据框:(例如functools.reduce(lambda left,right: pd.merge(left,right,on='index',how='outer'), [s.reset_index() for s in [serie_1, serier_2, serie_3]]))。 - unutbu
@SPS:我编辑了上面的帖子,加入了一些可运行的代码,展示了我的意思。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接