Python 基于预先存在的行连接数据帧

Python 基于预先存在的行连接数据帧,python,pandas,dataframe,merge,concat,Python,Pandas,Dataframe,Merge,Concat,我有以下函数,它生成一个初始数据帧,迭代一系列函数,并在每次迭代时将一个数据帧连接到初始数据帧: def get_variables_daily(start_date='1990-06-08', end_date='2015-05-04', describe=False): variables_daily = {"DP": [1, get_DP_daily], "PE": [1, get_PE_daily], "BM": [1, get_BM_daily], "CAPE": [1, get_C

我有以下函数,它生成一个初始数据帧,迭代一系列函数,并在每次迭代时将一个数据帧连接到初始数据帧:

def get_variables_daily(start_date='1990-06-08', end_date='2015-05-04', describe=False):

variables_daily = {"DP": [1, get_DP_daily], "PE": [1, get_PE_daily], "BM": [1, get_BM_daily], "CAPE": [1, get_CAPE_daily], 
         "PCAprice": [1, get_PCAprice_daily], "BY": [1, get_BY_daily], "DEF": [1, get_DEF_daily],
         "TERM": [1, get_TERM_daily], "CAY": [1, get_CAY_daily], "SIM": [1, get_SIM_daily], "VRP": [1, get_VRP_daily], 
         "IC": [0, get_IC_daily], "BDI": [1, get_BDI_daily], "NOS": [1, get_NOS_daily], "CPI": [1, get_CPI_daily],
         "PCR": [1, get_PCR_daily], "MA": [1, get_MA_daily],  "PCAtech": [0, get_PCAtech_daily], 
         "OIL": [1, get_OIL_daily], "SI": [1, get_SI_daily]}

    start_date = pd.to_datetime(start_date, yearfirst=True)
    end_date = pd.to_datetime(end_date, yearfirst=True)
    #create initial timeseries
    SPXR_1M = get_SPXR_daily(22, '1990-06-08', '2015-05-04')
    SPXR_3M = get_SPXR_daily(65, '1990-06-08', '2015-05-04')
    SPXR_6M = get_SPXR_daily(130, '1990-06-08', '2015-05-04')
    SPXR_12M = get_SPXR_daily(252, '1990-06-08', '2015-05-04')

    df1 = pd.concat([SPXR_1M, SPXR_3M, SPXR_6M, SPXR_12M], axis=1)
    #iterate over variables
    for key in variables_daily.keys():
        #check if variable should be used
        check = variables_daily[key][0]
        if check == 1:
            df2 = variables_daily[key][1](start_date, end_date).convert_objects(convert_numeric=True) 
            df1 = pd.concat([df1, df2], axis=1)                                   
    return df
如您所见,SPXR_1M、SPXR_3M、SPXR_6M和SPXR_12M是我的数据帧基础,这意味着我的行数不应超过SPXR_1M应有的行数。但是,如果您查看最终DF的摘要:

            count       mean       std        min        25%        50%  \
DP         5706.0   0.018063  0.004894   0.008400   0.014900   0.017900   
PE         6497.0  19.750139  4.267477  10.949800  16.581000  18.395300   
BM         6497.0   0.371955  0.088411   0.192378   0.323687   0.369440   
CAPE       6275.0  25.824579  6.981803  11.849780  20.973447  24.878816   
PCAprice   5706.0  -3.125544  3.082865 -17.258065  -4.958795  -2.354091   
BY         6249.0   0.977558  0.105177   0.566707   0.915942   0.972425   
DEF        6231.0   0.954645  0.413315   0.430000   0.700000   0.870000   
TERM       6485.0   1.865422  1.158198  -0.989000   0.916300   1.994900   
CAY        6275.0   0.000324  0.016228  -0.031944  -0.012895  -0.002148   
SIM        6252.0   0.742821  0.324054   0.007692   0.484615   0.976923   
VRP        6272.0   0.066305  0.038604  -0.141507   0.042648   0.059513   
BDI        6246.0   0.044917  0.324404  -0.900719  -0.133461   0.012865   
NOS        6191.0   0.010533  0.043129  -0.193359  -0.011152   0.010640   
CPI        6275.0   0.023318  0.011918  -0.020422   0.016667   0.024161   
PCR        6275.0  -1.361110  0.363751  -2.260664  -1.609558  -1.412000   
MA         6497.0   0.769432  0.421229   0.000000   1.000000   1.000000   
OIL        6252.0   0.012821  0.179430  -1.132002  -0.079546   0.029171   
SI         2226.0   3.689411  0.744130   1.952062   3.182868   3.719568   
SPXR_22D   6253.0   0.007297  0.045672  -0.297937  -0.016283   0.010915   
SPXR_65D   6210.0   0.022014  0.076810  -0.409638  -0.013432   0.028260   
SPXR_130D  6145.0   0.046397  0.113950  -0.474598  -0.003915   0.055771   
SPXR_252D  6023.0   0.091534  0.169579  -0.488228   0.028048   0.110181   

                 75%        max  
DP          0.020300   0.040000  
PE         23.155400  30.720600  
BM          0.437982   0.688610  
CAPE       27.720910  47.255292  
PCAprice   -0.651261   0.001848  
BY          1.042780   1.457659  
DEF         1.050000   3.500000  
TERM        2.793000   3.863000  
CAY         0.012844   0.031044  
SIM         1.000000   1.000000  
VRP         0.082342   0.372942  
BDI         0.196221   2.320175  
NOS         0.033015   0.253546  
CPI         0.029222   0.059571  
PCR        -1.140890  -0.333101  
MA          1.000000   1.000000  
OIL         0.119024   0.771293  
SI          4.202039   5.760021  
SPXR_22D    0.033889   0.224057  
SPXR_65D    0.067303   0.388187  
SPXR_130D   0.112865   0.541292  
SPXR_252D   0.200745   0.685735  
您可以看到,观察结果并不一致,但如果行数较少,它们基本上都应该是6253或稍少一点。我的连接没有正确处理附加数据帧中的额外行吗?
编辑:在所有连接之后,我的初始列中似乎有很多空白。有没有办法让panda只从数据帧B中添加数据帧A已有的行?

我有一些想法:

  • pd.concat
    将混合数据帧标记并为缺失的值生成NA,请尝试设置
    join=internal
    参数

  • 如果您可以按列重新组织数据创建-也可以尝试合并,可能需要左合并

  • 不要用
    .dropna()
    关闭NA值-它们可能会显示插入了哪些额外的行

  • 尝试关闭第二个concat调用,以便确定这两个调用中的哪一个是造成问题的


  • 什么是每日变量?全局变量?另外-为什么不将您的代码清理到MWE,例如删除打印和
    corr
    计算,这会混淆
    df
    帧的原始问题?我的错误,没有粘贴MWE。variables_daily只是一个带有T/F:函数对的dict,所以我可以检查我想要得到哪些变量。post现在在函数中有dict,只有在有某种索引的情况下才能实现这一点(因为观察值的数字不同)。例如,每行的
    id
    ,或类似时间戳的东西。你有这样的东西吗?我真傻,我忘了提到这都是日常数据,所以是的,每行都有一个时间戳。整个DF是一个大的timeseries,一次增长1个变量。在本例中,类似于
    df1.set_index('time')。join(df2.set_index('time'),how='inner')
    应该这样做。顺便说一句,如果您在注释部分提到某人,请使用@-否则用户不会收到通知。join='inner'会显著减少计数,并从数据帧中删除原始行。我相信合并和交叉口没什么不同。我移除了dropna,我100%确定是第二个concat造成了麻烦。在第二个concat中发生了很多事情,这些都是不可追踪的。那么为什么不重新排列代码来创建列呢?它们更容易检查。好吧,每个变量都在完全相同的时间跨度上,但是由于这些是财务变量,它们没有在同一天报告,并且由于假期和许多其他原因,它们没有完全对齐。我的想法是以我的SPXR和列为基础,并简单地附加与DF中预先存在的时间戳相匹配的任何时间跨度值。按列生成新变量并左合并到基础数据帧?我不确定“按列生成变量”是什么意思,尽管我相信我理解左合并