如何使用日期时间索引和列连接许多数据框?

时间:2019-04-25 14:08:26

标签: python pandas dataframe concatenation

我有很多数据框。每个人都有一个日期时间索引。某些数据框具有相同的列名,而某些。日期时间索引是相同的。同样,如果两个数据框具有相同的列,则它们不能具有相同的索引。然后,数据框没有相同的形状,但是都基于日期时间索引。

我想将所有数据框按日期时间索引和列连接。如果对于某个日期,某一列没有任何值,我希望它为 NaN

我正在使用熊猫在python中使用数据框。

我尝试过(轴= 0或1):

data = pd.concat(list_dataframes)

,但不起作用:相同的日期出现几次,或者由于数据框的长度(日期时间范围)不同而发生错误。

总而言之,我希望能够拥有一个一个数据帧,其中整个日期时间索引和列都存在于我拥有的所有数据帧中。

感谢您的帮助。

以下数据帧之一的示例: enter image description here

1 个答案:

答案 0 :(得分:1)

有时候,猜测的工作量较小。我以为OP在问的是,有一堆数据帧,其中一些共享公共列,另一些共享公共索引。因此,一些需要沿着轴0组合,而这些串联的结果需要沿着轴1串联。

设置

假定这9个数据帧中有三种类型的列。列为['A', 'B', 'C']['D', 'E', 'F']['G', 'H', 'I']的用户。还有,三种类型的索引。截止日期为2011、2012和2013的月份。

tidx1 = pd.date_range('2010-12-31', freq='M', periods=12)
tidx2 = pd.date_range('2011-12-31', freq='M', periods=12)
tidx3 = pd.date_range('2012-12-31', freq='M', periods=12)

cols1 = [*'ABC']
cols2 = [*'DEF']
cols3 = [*'GHI']

np.random.seed([3, 1415])
dfs = [pd.DataFrame(np.random.rand(12, 3), i, c)
       for i in [tidx1, tidx2, tidx3] for c in [cols1, cols2, cols3]]

如果我打印了第一行:

print(*[d.head(1) for d in dfs], sep='\n\n')

                   A         B         C
2010-12-31  0.444939  0.407554  0.460148

                   D         E         F
2010-12-31  0.764869  0.253200  0.548054

                   G         H         I
2010-12-31  0.067359  0.774688  0.009526

                   A         B         C
2011-12-31  0.698617  0.979221  0.037819

                   D         E         F
2011-12-31  0.813683  0.024600  0.978336

                   G         H         I
2011-12-31  0.038986  0.006073  0.254859

                   A         B         C
2012-12-31  0.123621  0.842938  0.580312

                   D         E         F
2012-12-31  0.663650  0.215170  0.382212

                   G         H         I
2012-12-31  0.068951  0.294619  0.285245

解决方案

我想先按列分组,然后在理解中使用pd.concat

df_groups = {}

for df in dfs:
    key = frozenset(df.columns)
    df_groups.setdefault(key, []).append(df)

pd.concat([
    pd.concat([dc for dc in df_sub])
    for df_sub in df_groups.values()
], axis=1)

输出


                   A         B         C         D         E         F         G         H         I
2010-12-31  0.444939  0.407554  0.460148  0.764869  0.253200  0.548054  0.067359  0.774688  0.009526
2011-01-31  0.465239  0.462691  0.016545  0.778883  0.651676  0.136097  0.149733  0.585309  0.811828
2011-02-28  0.850445  0.817744  0.777962  0.544838  0.035073  0.275079  0.639003  0.132974  0.883372
2011-03-31  0.757983  0.934829  0.831104  0.706685  0.713614  0.776050  0.882258  0.391942  0.099619
2011-04-30  0.879891  0.926879  0.721535  0.542329  0.836541  0.538186  0.071612  0.651631  0.015642
2011-05-31  0.117642  0.145906  0.199844  0.185523  0.652151  0.746060  0.348386  0.606346  0.401578
2011-06-30  0.437564  0.100702  0.278735  0.373741  0.603536  0.775801  0.847639  0.641232  0.250046
2011-07-31  0.609862  0.085823  0.836997  0.091238  0.504035  0.671320  0.503790  0.440365  0.243070
2011-08-31  0.739635  0.866059  0.691271  0.619939  0.301644  0.956463  0.461382  0.283622  0.109229
2011-09-30  0.377185  0.225146  0.435280  0.702457  0.367810  0.454935  0.314665  0.225839  0.859034
2011-10-31  0.700900  0.700946  0.796487  0.882029  0.880251  0.496250  0.010327  0.639184  0.205293
2011-11-30  0.018688  0.700566  0.900749  0.805688  0.038985  0.438329  0.129987  0.448391  0.366678
2011-12-31  0.698617  0.979221  0.037819  0.813683  0.024600  0.978336  0.038986  0.006073  0.254859
2012-01-31  0.560599  0.773646  0.723712  0.616345  0.445424  0.055701  0.682586  0.226415  0.991061
2012-02-29  0.029056  0.021850  0.112871  0.541340  0.735793  0.163323  0.990199  0.550963  0.121778
2012-03-31  0.375866  0.667671  0.636299  0.884157  0.592664  0.114829  0.744816  0.897881  0.139763
2012-04-30  0.474412  0.800556  0.364394  0.864268  0.117149  0.709288  0.567098  0.069015  0.780812
2012-05-31  0.728499  0.071969  0.305145  0.066660  0.700911  0.198066  0.957639  0.286822  0.951477
2012-06-30  0.467122  0.111486  0.537449  0.552404  0.105812  0.369154  0.015311  0.463177  0.084191
2012-07-31  0.624568  0.246598  0.887655  0.809073  0.470078  0.025123  0.807285  0.425915  0.314156
2012-08-31  0.119408  0.589169  0.384039  0.881872  0.378020  0.872950  0.673316  0.351912  0.039022
2012-09-30  0.857798  0.654579  0.185472  0.413052  0.354193  0.294681  0.495490  0.446053  0.195945
2012-10-31  0.737311  0.866795  0.080936  0.311414  0.627207  0.165256  0.904418  0.534207  0.140122
2012-11-30  0.297743  0.336371  0.400472  0.575506  0.206212  0.431040  0.878589  0.096615  0.415686
2012-12-31  0.123621  0.842938  0.580312  0.663650  0.215170  0.382212  0.068951  0.294619  0.285245
2013-01-31  0.709768  0.604121  0.593387  0.146662  0.019847  0.361099  0.001559  0.961979  0.415321
2013-02-28  0.960484  0.795752  0.483328  0.568315  0.015255  0.314391  0.224125  0.149543  0.873957
2013-03-31  0.135724  0.876926  0.653998  0.292689  0.115870  0.147942  0.976790  0.564139  0.588085
2013-04-30  0.228189  0.297403  0.007808  0.420111  0.262472  0.809144  0.731854  0.313508  0.262154
2013-05-31  0.134206  0.081202  0.122216  0.375930  0.112703  0.023932  0.880654  0.897069  0.876440
2013-06-30  0.908906  0.676719  0.032016  0.307829  0.923390  0.768263  0.084670  0.184191  0.374396
2013-07-31  0.776158  0.911811  0.826244  0.227400  0.325776  0.462828  0.678547  0.266153  0.387923
2013-08-31  0.993297  0.405039  0.246078  0.893535  0.295378  0.380805  0.372939  0.358029  0.791162
2013-09-30  0.185163  0.968741  0.224807  0.168866  0.709602  0.994510  0.800004  0.540143  0.671301
2013-10-31  0.723072  0.554268  0.293442  0.158512  0.145731  0.011970  0.078916  0.513555  0.068210
2013-11-30  0.654131  0.006453  0.190228  0.555713  0.302839  0.035536  0.436647  0.635284  0.351624