python2 pandas:如何将另一个数据帧的一部分合并到一个数据帧

时间:2017-06-26 03:47:56

标签: python-2.7 dataframe

我有一个数据帧(df1)如下:

       datetime     m  d    1d    2d   3d
       2014-01-01   1  1     2     2   3
       2014-01-02   1  2     3     4   3
       2014-01-03   1  3     1     2   3
       ...........
       2014-12-01  12  1      2     2   3
       2014-12-31  12  31     2     2   3

我还有另一个数据帧(df2)如下:

       datetime     m  d       
       2015-01-02   1  2     
       2015-01-03   1  3     
       ...........
       2015-12-01  12  1      
       2015-12-31  12  31     

我想将df1的1d 2d 3d列值合并到df2。 有两个条件:     (1)只有m和d在df1和df2都可以合并。     (2)如果df2指数%30 = = 0的指数不合并,则这些指数的1d 2d 3d值可以为Nan。

I mean I want the new dataframe of df2 like as following:

       datetime     m  d    1d    2d   3d
       2015-01-02   1  2   Nan     Nan   Nan
       2015-01-03   1  3     1     2   3
       ...........
       2015-12-01  12  1      2     2   3
       2015-12-31  12  31     2     2   3

提前致谢!

3 个答案:

答案 0 :(得分:3)

我认为您需要在loc之后添加NaN,然后在左连接时添加merge

np.random.seed(10)
N = 365
rng = pd.date_range('2015-01-01', periods=N)
df_tr_2014 = pd.DataFrame(np.random.randint(10, size=(N, 3)), index=rng).reset_index()
df_tr_2014.columns = ['datetime','7d','15d','20d']
df_tr_2014.insert(1,'month', df_tr_2014['datetime'].dt.month)
df_tr_2014.insert(2,'day_m', df_tr_2014['datetime'].dt.day)
#print (df_tr_2014.head())

N = 366
rng = pd.date_range('2016-01-01', periods=N)
df_te = pd.DataFrame(index=rng)
df_te['month'] = df_te.index.month
df_te['day_m'] = df_te.index.day
df_te = df_te.reset_index()
#print (df_te.tail())
df2 = df_te.copy()
df1 = df_tr_2014.copy()
df1 = df1.set_index('datetime')
df1.index += pd.offsets.DateOffset(years=1)

#correct 29 February
y = df1.index[0].year
df1 = df1.reindex(pd.date_range(pd.datetime(y,1,1), pd.datetime(y,12,31)))
idx = df1.index[(df1.index.month == 2) & (df1.index.day == 29)]

df1.loc[idx, :] = df1.loc[idx - pd.Timedelta(1, unit='d'), :].values
df1.loc[idx, 'day_m'] = idx.day
df1[['month','day_m']] = df1[['month','day_m']].astype(int)

df1[['7d','15d', '20d']] = df1[['7d','15d', '20d']].astype(float)

df1.loc[np.arange(len(df1.index))  % 30 == 0, ['7d','15d','20d']] = 0
df1 = df1.reset_index()
print (df1.iloc[57:62])
        index  month  day_m   7d  15d  20d
57 2016-02-27      2     27  2.0  0.0  1.0
58 2016-02-28      2     28  2.0  3.0  5.0
59 2016-02-29      2     29  2.0  3.0  5.0
60 2016-03-01      3      1  0.0  0.0  0.0
61 2016-03-02      3      2  7.0  6.0  9.0

答案 1 :(得分:1)

为什么不删除df1中与(m, d)中的df2对不匹配的行?

df_new = df2.drop(df2[(not ((df2.m == df1.m) & (df2.n == df1.n)).any()) or (df2.index % 30 == 0)].index)

或类似的东西。

the list相关答案。

我对熊猫并不十分熟悉,也没有测试过上面的例子。

答案 2 :(得分:0)

df_te是df2 df_tr_2014是df1 7d 15d 20分别是1d 2d 3d。 size_df_te是df_te的长度,month和day_m是m,d在df2中

df_te['7d'] = 0
df_te['15d'] = 0
df_te['20d'] = 0
mj = 0
dj = 0
for i in range(size_df_te):
    if i%30 != 0:
        m = df_te.loc[i,'month']
        d = df_te.loc[i,'day_m']
        if (m== 2) & (d == 29):
            m = 2
            d = 28
        dk_7 = df_tr_2014.loc[(df_tr_2014['month']==m) & (df_tr_2014['day_m']==d)]['7d']
        dk_15 = df_tr_2014.loc[(df_tr_2014['month']==m) & (df_tr_2014['day_m']==d)]['15d']
        dk_20 = df_tr_2014.loc[(df_tr_2014['month']==m) & (df_tr_2014['day_m']==d)]['20d']
        df_te.loc[i,'7d'] = float(dk_7)
        df_te.loc[i,'15d'] = float(dk_15)
        df_te.loc[i,'20d'] = float(dk_20)

编辑:

示例数据:

np.random.seed(10)
N = 365
rng = pd.date_range('2014-01-01', periods=N)
df_tr_2014 = pd.DataFrame(np.random.randint(10, size=(N, 3)), index=rng).reset_index()
df_tr_2014.columns = ['datetime','7d','15d','20d']
df_tr_2014.insert(1,'month', df_tr_2014['datetime'].dt.month)
df_tr_2014.insert(2,'day_m', df_tr_2014['datetime'].dt.day)
#print (df_tr_2014.head())

N = 365
rng = pd.date_range('2015-01-01', periods=N)
df_te = pd.DataFrame(index=rng)
df_te['month'] = df_te.index.month
df_te['day_m'] = df_te.index.day
df_te = df_te.reset_index()
#print (df_te.head())