如何将一系列较小的尺寸连接到熊猫数据框的底部

时间:2019-05-26 17:25:15

标签: python pandas dataframe concatenation

我正在尝试将Series系列连接到列名为“ RSI”的数据框的右侧。但是,由于Series的长度比数据框中的其他列短,因此我需要确保将NaN值附加到该列的顶部而不是底部。现在,我已经使用了以下代码,但找不到能使我获得所需输出的参数。

RSI = pd.Series(RSI)
df = pd.concat((df, RSI.rename('RSI'), axis='columns')

到目前为止,这是我的输出:

      Dates  Prices   Volumes      RSI
0    2013-02-08  201.68   2893254  47.7357
1    2013-02-11  200.16   2944651  53.3967
2    2013-02-12  200.04   2461779  56.3866
3    2013-02-13  200.09   2169757  60.1845
4    2013-02-14  199.65   3294126  62.1784
5    2013-02-15  200.98   3627887  63.9720
6    2013-02-19  200.32   2998317  62.9671
7    2013-02-20  199.31   3715311  63.9232
8    2013-02-21  198.33   3923051  66.8817
9    2013-02-22  201.09   3107876  72.8258
10   2013-02-25  197.51   3845276  69.6578
11   2013-02-26  199.14   3391562  63.8458
12   2013-02-27  202.33   4185545  64.2776
13   2013-02-28  200.83   4689698  67.2445
14   2013-03-01  202.91   3308544  58.2408
15   2013-03-04  205.19   3693365  57.7058
16   2013-03-05  206.53   3807706  53.7482
17   2013-03-06  208.38   3594899  57.5396
18   2013-03-07  209.42   3884317  53.2722
19   2013-03-08  210.38   3700086  58.6824
20   2013-03-11  210.08   3048901  56.0161
21   2013-03-12  210.55   3591261  60.2066
22   2013-03-13  212.06   3355969  55.3322
23   2013-03-14  215.80   5505484  51.7492
24   2013-03-15  214.92   7935024  47.1241
25   2013-03-18  213.21   3006125  46.9102
26   2013-03-19  213.44   3198577  46.6569
27   2013-03-20  215.06   3019153  54.0822
28   2013-03-21  212.26   5830566  56.2525
29   2013-03-22  212.08   3015847  51.8359
...         ...     ...       ...      ...
1229 2017-12-26  152.83   2479017  80.1930
1230 2017-12-27  153.13   2149257  80.7444
1231 2017-12-28  154.04   2687624  56.4425
1232 2017-12-29  153.42   3327087  56.9183
1233 2018-01-02  154.25   4202503  63.6958
1234 2018-01-03  158.49   9441567  61.1962
1235 2018-01-04  161.70   7556249  61.3816
1236 2018-01-05  162.49   5195764  64.7724
1237 2018-01-08  163.47   5237523  63.0508
1238 2018-01-09  163.83   4341810  53.9559
1239 2018-01-10  164.18   4174105  54.1351
1240 2018-01-11  164.20   3794453  50.6824
1241 2018-01-12  163.14   5031886  43.0222
1242 2018-01-16  163.85   7794195  32.7428
1243 2018-01-17  168.65  11710033  39.4754
1244 2018-01-18  169.12  14259345  37.3409
1245 2018-01-19  162.37  21172488      NaN
1246 2018-01-22  162.60   8480795      NaN
1247 2018-01-23  166.25   7466232      NaN
1248 2018-01-24  165.37   5645003      NaN
1249 2018-01-25  165.47   3302520      NaN
1250 2018-01-26  167.34   3787913      NaN
1251 2018-01-29  166.80   3516995      NaN
1252 2018-01-30  163.62   4902341      NaN
1253 2018-01-31  163.70   4072830      NaN
1254 2018-02-01  162.40   4434242      NaN
1255 2018-02-02  159.03   5251938      NaN
1256 2018-02-05  152.53   8746599      NaN
1257 2018-02-06  155.34   9867678      NaN
1258 2018-02-07  153.85   6149207      NaN

但是,我需要它看起来像这样:

          Dates  Prices   Volumes      RSI
0    2013-02-08  201.68   2893254  NaN
1    2013-02-11  200.16   2944651  NaN
2    2013-02-12  200.04   2461779  NaN
3    2013-02-13  200.09   2169757  NaN
4    2013-02-14  199.65   3294126  NaN
5    2013-02-15  200.98   3627887  NaN
6    2013-02-19  200.32   2998317  NaN
7    2013-02-20  199.31   3715311  NaN
8    2013-02-21  198.33   3923051  NaN
9    2013-02-22  201.09   3107876  NaN
10   2013-02-25  197.51   3845276  NaN
11   2013-02-26  199.14   3391562  NaN
12   2013-02-27  202.33   4185545  NaN
13   2013-02-28  200.83   4689698  NaN
14   2013-03-01  202.91   3308544  NaN
15   2013-03-04  205.19   3693365  57.7058
16   2013-03-05  206.53   3807706  53.7482
17   2013-03-06  208.38   3594899  57.5396
18   2013-03-07  209.42   3884317  53.2722
19   2013-03-08  210.38   3700086  58.6824
20   2013-03-11  210.08   3048901  56.0161
21   2013-03-12  210.55   3591261  60.2066
22   2013-03-13  212.06   3355969  55.3322
23   2013-03-14  215.80   5505484  51.7492
24   2013-03-15  214.92   7935024  47.1241
25   2013-03-18  213.21   3006125  46.9102
26   2013-03-19  213.44   3198577  46.6569
27   2013-03-20  215.06   3019153  54.0822
28   2013-03-21  212.26   5830566  56.2525
29   2013-03-22  212.08   3015847  51.8359
...         ...     ...       ...      ...
1229 2017-12-26  152.83   2479017  80.1930
1230 2017-12-27  153.13   2149257  80.7444
1231 2017-12-28  154.04   2687624  56.4425
1232 2017-12-29  153.42   3327087  56.9183
1233 2018-01-02  154.25   4202503  63.6958
1234 2018-01-03  158.49   9441567  61.1962
1235 2018-01-04  161.70   7556249  61.3816
1236 2018-01-05  162.49   5195764  64.7724
1237 2018-01-08  163.47   5237523  63.0508
1238 2018-01-09  163.83   4341810  53.9559
1239 2018-01-10  164.18   4174105  54.1351
1240 2018-01-11  164.20   3794453  50.6824
1241 2018-01-12  163.14   5031886  43.0222
1242 2018-01-16  163.85   7794195  32.7428
1243 2018-01-17  168.65  11710033  39.4754
1244 2018-01-18  169.12  14259345  36.9999
1245 2018-01-19  162.37  21172488  41.1297
1246 2018-01-22  162.60   8480795  12.1231
1247 2018-01-23  166.25   7466232  39.0977    
1248 2018-01-24  165.37   5645003  63.6958
1249 2018-01-25  165.47   3302520  56.4425
1250 2018-01-26  167.34   3787913  80.7444
1251 2018-01-29  166.80   3516995  61.1962
1252 2018-01-30  163.62   4902341  58.6824
1253 2018-01-31  163.70   4072830  53.7482
1254 2018-02-01  162.40   4434242  43.0222
1255 2018-02-02  159.03   5251938  61.1962
1256 2018-02-05  152.53   8746599  56.4425
1257 2018-02-06  155.34   9867678  36.0978
1258 2018-02-07  153.85   6149207  41.1311

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

尝试这样:

df["RSI"].shift(len(df)-len(df["RSI"].dropna()))

答案 1 :(得分:0)

另一种方法是操纵rsi系列索引以自底向上匹配df索引(我仅将示例的13行用于演示)

size_diff = df.index.size - rsi.index.size
rsi.index = df.index[size_diff:]
pd.concat([df, rsi], axis=1)

Out[1490]:
         Dates  Prices  Volumes      RSI
0   2013-02-08  201.68  2893254      NaN
1   2013-02-11  200.16  2944651      NaN
2   2013-02-12  200.04  2461779      NaN
3   2013-02-13  200.09  2169757      NaN
4   2013-02-14  199.65  3294126      NaN
5   2013-02-15  200.98  3627887  47.7357
6   2013-02-19  200.32  2998317  53.3967
7   2013-02-20  199.31  3715311  56.3866
8   2013-02-21  198.33  3923051  60.1845
9   2013-02-22  201.09  3107876  62.1784
10  2013-02-25  197.51  3845276  63.9720
11  2013-02-26  199.14  3391562  62.9671
12  2013-02-27  202.33  4185545  63.9232
13  2013-02-28  200.83  4689698  66.8817

答案 2 :(得分:0)

我们可以得到Seriesdataframe之间的行数差异。

然后将NaN中的差异附加到np.repeat的系列中(顶部)

最后将带有NaN的新系列附加到原始的数据框(沿axis = 1(列))

diff = df.shape[0] - RSI.shape[0]
rpts = np.repeat(np.NaN, diff)

RSI = pd.concat([pd.Series(rpts, name='RSI'), RSI], ignore_index=True)

pd.concat([df, RSI['RSI']], axis=1).head(20)

         Dates  Prices  Volumes      RSI
0   2013-02-08  201.68  2893254      NaN
1   2013-02-11  200.16  2944651      NaN
2   2013-02-12  200.04  2461779      NaN
3   2013-02-13  200.09  2169757      NaN
4   2013-02-14  199.65  3294126      NaN
5   2013-02-15  200.98  3627887      NaN
6   2013-02-19  200.32  2998317      NaN
7   2013-02-20  199.31  3715311      NaN
8   2013-02-21  198.33  3923051      NaN
9   2013-02-22  201.09  3107876      NaN
10  2013-02-25  197.51  3845276      NaN
11  2013-02-26  199.14  3391562      NaN
12  2013-02-27  202.33  4185545      NaN
13  2013-02-28  200.83  4689698  47.7357
14  2013-03-01  202.91  3308544  53.3967
15  2013-03-04  205.19  3693365  56.3866
16  2013-03-05  206.53  3807706  60.1845
17  2013-03-06  208.38  3594899  62.1784
18  2013-03-07  209.42  3884317  63.9720
19  2013-03-08  210.38  3700086  62.9671