ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-用Multiindex列和不规则的时间戳连接Pandas DataFrames

2019-11-21 16:09:19  阅读:237  来源: 互联网

标签:concat multi-index pandas time-series python


我在列表中有很多单独的数据框,每个数据框都有多索引列,并且是针对不同时间段和长度的时间序列.我想做三件事:

>汇集所有单独的数据框
>任何具有相同多索引列的数据框都会追加和排序
沿时间轴
>具有不同多索引列的数据框将并置
列轴(轴= 1)

我知道默认情况下,`pandas.concat(objs,axis = 1)合并列并对行索引进行排序,但是我也希望具有相同标签和级别的数据帧在较长的时间轴上连接,而不是完全将它们放在一边并排.

我还要提到的是,具有相同标签和级别的数据帧处于相互连接但不重叠的不同时间段.

举个例子:

first,second,third = rand(5,2),rand(5,2),rand(10,2)

a = pd.DataFrame(first, index=pd.DatetimeIndex(start='1990-01-01', periods=5, freq='d'))
a.columns = pd.MultiIndex.from_tuples([('A','a'),('A','b')])

b = pd.DataFrame(second, index=pd.DatetimeIndex(start='1990-01-06', periods=5, freq='d'))
b.columns = pd.MultiIndex.from_tuples([('A','a'),('A','b')])

c = pd.DataFrame(third, index=pd.DatetimeIndex(start='1990-01-01', periods=10, freq='d'))
c.columns = pd.MultiIndex.from_tuples([('B','a'),('B','b')])

pd.concat([a,b,c], axis=1)

给出以下内容:

Out[3]:
    A   B
    a   b   a   b   a   b
1990-01-01  0.351481    0.083324    NaN     NaN     0.060026    0.124302
1990-01-02  0.486032    0.742887    NaN     NaN     0.570997    0.633906
1990-01-03  0.145066    0.386665    NaN     NaN     0.166567    0.147794
1990-01-04  0.257831    0.995324    NaN     NaN     0.630652    0.534507
1990-01-05  0.446912    0.374049    NaN     NaN     0.311473    0.727622
1990-01-06  NaN     NaN     0.920003    0.051772    0.731657    0.393296
1990-01-07  NaN     NaN     0.142397    0.837654    0.597090    0.833893
1990-01-08  NaN     NaN     0.506141    0.056407    0.832294    0.222501
1990-01-09  NaN     NaN     0.655442    0.754245    0.802421    0.743875
1990-01-10  NaN     NaN     0.195767    0.880637    0.215509    0.857576

有一个简单的方法来做到这一点吗?

d = a.append(b)
pd.concat([d,c], axis=1)

Out[4]:
    A   B
    a   b   a   b
1990-01-01  0.351481    0.083324    0.060026    0.124302
1990-01-02  0.486032    0.742887    0.570997    0.633906
1990-01-03  0.145066    0.386665    0.166567    0.147794
1990-01-04  0.257831    0.995324    0.630652    0.534507
1990-01-05  0.446912    0.374049    0.311473    0.727622
1990-01-06  0.920003    0.051772    0.731657    0.393296
1990-01-07  0.142397    0.837654    0.597090    0.833893
1990-01-08  0.506141    0.056407    0.832294    0.222501
1990-01-09  0.655442    0.754245    0.802421    0.743875
1990-01-10  0.195767    0.880637    0.215509    0.857576

这里的关键是我不知道如何在列表中对数据帧进行排序,我基本上需要一些知道何时要concat(obj,axis = 1)或concat(obj,axis = 0)的东西,可以做到这一点来组合我的数据框列表.也许熊猫中已经有某些东西可以做到这一点?

解决方法:

我不确定是否有一种方法可以做到这一点(可能有)…
这是我考虑创建一个空框架然后填充它的一次:

In [11]: frames = [a, b, c]

获取其索引和列的并集:

In [12]: index = sum(x.index for x in frames)
         cols = sum(x.columns for x in frames)

In [13]: res = pd.DataFrame(index=index, columns=cols)

在每个框架中填写此标签(按标签):

In [14]: for df in [a, b, c]:
             res.loc[df.index, df.columns] = df

In [15]: res
Out[15]:
                     A                     B
                     a           b         a         b
1990-01-01   0.8516285   0.4087078  0.577000  0.595293
1990-01-02   0.6544393   0.4377864  0.851378  0.595919
1990-01-03   0.3123428  0.03825423  0.834704  0.989195
1990-01-04   0.2314499   0.4971448  0.343455  0.770400
1990-01-05   0.1982945   0.9031414  0.466225  0.463490
1990-01-06   0.7370323   0.3923151  0.263120  0.892815
1990-01-07  0.09038236   0.8778266  0.643816  0.049769
1990-01-08   0.7199705  0.02114493  0.766267  0.472471
1990-01-09  0.06733081    0.443561  0.984558  0.443647
1990-01-10   0.4695022   0.5648693  0.870240  0.949072

标签:concat,multi-index,pandas,time-series,python
来源: https://codeday.me/bug/20191121/2053016.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有