【发布时间】:2019-07-12 03:09:35
【问题描述】:
我有 2 个 pandas DataFrame,我需要以某种复杂的方式合并,所以我需要一些帮助。
要插入的数据帧:
AAPL shares GOOG shares MSFT shares
date
2019-01-01 0.0 10.0 0.0
2019-01-05 0.0 0.0 15.0
2019-01-12 0.0 0.0 7.0
2019-01-13 3.0 0.0 0.0
2019-01-14 0.0 -5.0 0.0
DataFrame 接收插入
0 1 2 3 4 5
0 1998-01-02 16.25 2014-03-27 558.46 1998-01-02 131.13
1 1998-01-05 15.88 2014-03-28 559.99 1998-01-05 130.38
2 1998-01-06 18.94 2014-03-31 556.97 1998-01-06 131.13
3 1998-01-07 17.50 2014-04-01 567.16 1998-01-07 129.56
4 1998-01-08 18.19 2014-04-02 567.00 1998-01-08 130.50
5 1998-01-09 18.19 2014-04-03 569.74 1998-01-09 127.00
6 1998-01-12 18.25 2014-04-04 543.14 1998-01-12 129.50
7 1998-01-13 19.50 2014-04-07 538.15 1998-01-13 132.13
8 1998-01-14 19.75 2014-04-08 554.90 1998-01-14 131.13
9 1998-01-15 19.19 2014-04-09 564.14 1998-01-15 132.31
10 1998-01-16 18.81 2014-04-10 540.95 1998-01-16 135.25
11 1998-01-20 19.06 2014-04-11 530.60 1998-01-20 137.81
12 1998-01-21 18.91 2014-04-14 532.52 1998-01-21 137.00
13 1998-01-22 19.25 2014-04-15 536.44 1998-01-22 138.63
14 1998-01-23 19.50 2014-04-16 556.54 1998-01-23 138.25
15 1998-01-26 19.44 2014-04-17 536.10 1998-01-26 141.75
1)receiving_df需要为date建立一个共同的基础(注意栏2不同),因此DataFrame需要组织成date、1、3 , 5 其中0、2和4的日期用于组装date以正确反映1、3、5在某个日期的值。
第 1 步的示例输出:
0 1 3 5
0 1998-01-02 16.25 NA 131.13
1 1998-01-05 15.88 NA 130.38
2 1998-01-06 18.94 NA 131.13
3 1998-01-07 17.50 NA 129.56
4 1998-01-08 18.19 NA 130.50
5 1998-01-09 18.19 NA 127.00
6 1998-01-12 18.25 NA 129.50
7 1998-01-13 19.50 NA 132.13
8 1998-01-14 19.75 NA 131.13
...
10 2014-04-10 18.81 558.46 135.25
11 2014-04-11 19.06 559.99 137.81
12 2014-04-14 18.91 556.97 137.00
13 2014-04-15 19.25 567.16 138.63
14 2014-04-16 19.50 567.00 138.25
15 2014-04-17 19.44 569.74 141.75
...
2) inserting_df 需要根据receiving_df['date'] 按日期排序,AAPL shares、GOOG shares、MSFT shares 列将作为列添加到receiving_df 中。我想这将遵循与 1) 中类似的方法。
步骤 2 的示例输出:
0 AAPL shares 1 GOOG shares 3 MSFT shares 5
0 1998-01-02 0.0 16.25 0.0 NA 0.0 131.13
1 1998-01-05 0.0 15.88 0.0 NA 0.0 130.38
2 1998-01-06 0.0 18.94 0.0 NA 0.0 131.13
3 1998-01-07 0.0 17.50 0.0 NA 0.0 129.56
4 1998-01-08 0.0 18.19 0.0 NA 0.0 130.50
5 1998-01-09 0.0 18.19 0.0 NA 0.0 127.00
6 1998-01-12 0.0 18.25 0.0 NA 0.0 129.50
7 1998-01-13 0.0 19.50 0.0 NA 0.0 132.13
8 1998-01-14 0.0 19.75 0.0 NA 0.0 131.13
...
10 2014-04-10 0.0 18.81 0.0 558.46 0.0 135.25
11 2014-04-11 0.0 19.06 0.0 559.99 0.0 137.81
12 2014-04-14 0.0 18.91 0.0 556.97 0.0 137.00
13 2014-04-15 0.0 19.25 0.0 567.16 0.0 138.63
14 2014-04-16 0.0 19.50 0.0 567.00 0.0 138.25
15 2014-04-17 0.0 19.44 0.0 569.74 0.0 141.75
...
<#> 2019-01-01 0.0 <value> 10.0 <value> 0.0 <value>
<#> 2019-01-02 0.0 <value> 0.0 <value> 15.0 <value>
<#> 2019-01-03 0.0 <value> 0.0 <value> 7.0 <value>
<#> 2019-01-04 3.0 <value> 0.0 <value> 0.0 <value>
<#> 2019-01-05 0.0 <value> -5.0 <value> 0.0 <value>
3) 新列 AAPL shares、GOOG shares、MSFT shares 需要用 cumsum 向前填充,但我想我明白了:
~df.set_index('date').sort_index().fillna(value=0).cumsum())
步骤 3 的示例输出:
0 AAPL shares 1 GOOG shares 3 MSFT shares 5
0 1998-01-02 0.0 16.25 0.0 NA 0.0 131.13
1 1998-01-05 0.0 15.88 0.0 NA 0.0 130.38
2 1998-01-06 0.0 18.94 0.0 NA 0.0 131.13
3 1998-01-07 0.0 17.50 0.0 NA 0.0 129.56
4 1998-01-08 0.0 18.19 0.0 NA 0.0 130.50
5 1998-01-09 0.0 18.19 0.0 NA 0.0 127.00
6 1998-01-12 0.0 18.25 0.0 NA 0.0 129.50
7 1998-01-13 0.0 19.50 0.0 NA 0.0 132.13
8 1998-01-14 0.0 19.75 0.0 NA 0.0 131.13
...
10 2014-04-10 0.0 18.81 0.0 558.46 0.0 135.25
11 2014-04-11 0.0 19.06 0.0 559.99 0.0 137.81
12 2014-04-14 0.0 18.91 0.0 556.97 0.0 137.00
13 2014-04-15 0.0 19.25 0.0 567.16 0.0 138.63
14 2014-04-16 0.0 19.50 0.0 567.00 0.0 138.25
15 2014-04-17 0.0 19.44 0.0 569.74 0.0 141.75
...
<#> 2019-01-01 0.0 <value> 10.0 <value> 0.0 <value>
<#> 2019-01-02 0.0 <value> 10.0 <value> 15.0 <value>
<#> 2019-01-03 0.0 <value> 10.0 <value> 22.0 <value>
<#> 2019-01-04 3.0 <value> 10.0 <value> 22.0 <value>
<#> 2019-01-05 3.0 <value> 5.0 <value> 22.0 <value>
因此,最终目标将导致根据date 指数持有的价值和股份。对于在结果receiving_df 中没有列2 值的date(因为2 列“缺少”某些日期),最好将该值设为N/A,但0 会够了。
很高兴澄清任何事情,我感谢任何/所有帮助,因为这是一个非常复杂的操作(至少对我而言),在此先感谢!
编辑:
现在尝试在一个循环中合并,因为 date-value 对的数量可能会有所不同。我现在有一个单独的DataFrames 列表,用于date-value 对:dfs_list。由于对的数量可能会有所不同,因此最好不要基于列标签 set_index 因此 set_index(rec_df.columns[0])。
rec_df = dfs_list[0].set_index(dfs_list[0].columns[0])
for dataframe in range(len(dfs_list)-1):
rec_df = pd.merge(left=rec_df, right=dfs_list[dataframe+1].set_index(dfs_list[dataframe+1].columns[0]),
left_index=True, right_index=True,
how='outer')
【问题讨论】:
-
目前还不清楚你在问什么。我认为,您首选输出的示例将非常有帮助,因为在这种情况下,日期之一匹配,因此根本不会插入数据。此外,
insert_df中的日期是否与第 0/4 列或第 2 列中receive_df中的日期相关?这看起来像是两者之间相当简单的pd.merge(),但添加的解释使它听起来更复杂,我似乎无法理解 -
抱歉,我会修改解释并提供示例输出
-
@G.Anderson 请查看我的更新编辑以反映每个步骤的示例输出,直到完成
标签: python pandas sorting date dataframe