根据索引(时间序列)合并Pandas行

时间:2014-04-17 03:45:41

标签: python-2.7 pandas

我使用Pandas .append()按照索引(日期)添加来自多个Pandas timeseries的列。但是,不是将公共日期的所有数据合并为一行,而是数据如下:

sve2_all.sort(inplace=True)
print sve2_all['20000101':'20000104']



Hgtot ng/l     Q l/s  DOC_mg/L  Flow_mm/day  MeHg ng/l Site  \
2000-01-01          NaN       NaN       NaN         0.18        NaN  NaN   
2000-01-01          NaN  0.613234       NaN          NaN        NaN  SVE   
2000-01-02          NaN       NaN       NaN         0.18        NaN  NaN   
2000-01-02          NaN  0.614410       NaN          NaN        NaN  SVE   
2000-01-03          NaN       NaN       NaN          NaN        NaN    2   
2000-01-03          NaN  0.617371       NaN          NaN        NaN  SVE   
2000-01-03          NaN       NaN       NaN          NaN        NaN  NaN   
2000-01-03          NaN       NaN       NaN         0.18        NaN  NaN   
2000-01-04          NaN  0.627733       NaN          NaN        NaN  SVE   
2000-01-04          NaN       NaN       NaN         0.18        NaN  NaN   

            TOC_filt.TOC  TOC_unfilt.TOC  Temp oC  pH  
2000-01-01           NaN             NaN      NaN NaN  
2000-01-01           NaN             NaN -12.6117 NaN  
2000-01-02           NaN             NaN      NaN NaN  
2000-01-02           NaN             NaN  -2.3901 NaN  
2000-01-03           NaN        8.224648      NaN NaN  
2000-01-03           NaN             NaN  -5.0064 NaN  
2000-01-03           NaN             NaN      NaN NaN  
2000-01-03           NaN             NaN      NaN NaN  
2000-01-04           NaN             NaN  -1.5868 NaN  
2000-01-04           NaN             NaN      NaN NaN  

[10 rows x 10 columns]

我尝试使用以下方式重新取样这些数据:

sve2_all.resample('D', how='mean')

并且还使用以下方式分组:

sve2_all.groupby(sve2_all.index.map(lambda t: t.day))

但是,DataFrame保持不变。如何将同一日期的行折叠为一个日期?感谢。

其他信息:我尝试使用Joris建议的pd.concat()(我必须传递0作为轴参数,因为1导致ValueError:cannot reindex from a duplicate axis)而不是{{1但是得到的.append()DataFrame相同,这是一个非均匀的非单调时间序列。我认为索引是问题,但我不知道我能做些什么来解决它,我认为一些时间戳可能包含小时信息,而其他时间戳不包含我尝试过我也试过使用{{1在使用.append()之前,在每个.resample('D',how='mean')上,但它并没有产生任何影响。

解决方案: Joris解决方案是正确的,我没有意识到DataFrame没有到位。将.concat()分配给新的.resample() Joris'建议提供了理想的结果。

1 个答案:

答案 0 :(得分:4)

append方法会附加'行到另一个数据帧,并且不会根据索引标签与它合并。为此,您可以使用concat

使用玩具示例:

In [14]: df1 = pd.DataFrame(np.random.randn(3,2), columns=list('AB'), index=pd.date_range('2000-01-01', periods=3))
In [15]: df1
Out[15]:
                   A         B
2000-01-01  1.532085 -1.338895
2000-01-02 -0.016784 -0.270698
2000-01-03 -1.680379  0.838287

In [16]: df2 = pd.DataFrame(np.random.randn(3,2), columns=list('CD'), index=pd.date_range('2000-01-01', periods=3))
In [17]: df2
Out[17]:
                   C         D
2000-01-01  0.375214 -0.812558
2000-01-02 -1.099848 -0.889941
2000-01-03  1.556383  0.870608

.append将追加行(df2中不在df1的列将添加,这就是这种情况):

In [18]: df1.append(df2)
Out[18]:
                   A         B         C         D
2000-01-01  1.532085 -1.338895       NaN       NaN
2000-01-02 -0.016784 -0.270698       NaN       NaN
2000-01-03 -1.680379  0.838287       NaN       NaN
2000-01-01       NaN       NaN  0.375214 -0.812558
2000-01-02       NaN       NaN -1.099848 -0.889941
2000-01-03       NaN       NaN  1.556383  0.870608

pd.concat()将两个数据帧连接在一个索引轴上:

In [19]: pd.concat([df1, df2], axis=1)
Out[19]:
                   A         B         C         D
2000-01-01  1.532085 -1.338895  0.375214 -0.812558
2000-01-02 -0.016784 -0.270698 -1.099848 -0.889941
2000-01-03 -1.680379  0.838287  1.556383  0.870608

除此之外,resample通常应该有效。