【问题标题】:Several time series to DataFrameDataFrame 的几个时间序列
【发布时间】:2012-11-23 13:44:29
【问题描述】:

我在将多个时间序列合并到一个通用 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'

我希望结果看起来像这样(第 2 列中有随机值):

                 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

怎么了?正如我所说,可能是基本的,但我无法弄清楚,我是初学者......

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    连接Series 的列表会返回DataFrame。因此,serie_4 是一个DataFrameserie_3Series。将 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
    

    要解决此问题,请重置索引并改为 merge DataFrames

    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)。这意味着我可以将两个系列连接到一个数据帧,然后将这个数据帧与另一个数据帧连接起来。我需要找到一个通用的解决方案,我可以在一个循环中添加多个系列,而我事先没有添加数字。
    • 只需创建一个 Python 列表并将您的系列附加到其中,然后将其提供给 pandas.concat,正如 @unutbu 上面所写的那样。
    • join 的使用看起来很通用!我将其更改为“serie_5 = serie_4.join(serie_3, how = 'outer')”,以便在上面的示例中包含 2012-01-12。我想获得一个通用解决方案的原因是我想组合几个不同的时间序列,其中会丢失数据,并使用 Pandas 功能来处理丢失的数据。谢谢!
    • 为什么命令serie_5 = pandas.concat([serie_1, serie_2, serie_3], join='outer', axis = 1) 不适用于我的系列?它返回错误:cannot reindex from a duplicate axis 实际上,mySeries,就像这里使用的系列一样,都是 pandas.core.series.Series,但我的也有第二个规范。你建议再问一个问题吗?
    • @SPS:至少有一个系列具有非唯一索引。在这种情况下,pd.concat 引发 ValueError: cannot reindex from a duplicate axis。要解决此问题,请将每个系列转换为 DataFrame(例如 s = s.reset_index()),然后将 index 列上的外部 merge the DataFrames 转换为:(例如 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]]))。
    猜你喜欢
    • 2016-07-08
    • 2018-09-23
    • 2018-10-10
    • 1970-01-01
    • 2015-02-14
    • 2021-07-31
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多