如何合并/合并/加入按日期时间索引的两个或多个Pandas DataFrame,并用NaN填补空白

时间:2019-04-13 15:23:48

标签: python-3.x pandas

为什么我的问题与主题相同的其他人(合并/合并/加入)不同?

我正在尝试合并2个Pandas数据框。两者均通过时间戳编制索引,但日期不同。我想将两者合并而不重复值,并用NaN填补空白。

某些框架的长度不同。

我有2个数据帧,如下所示:

- name: Create the expected hash
  set_fact:
    my_hash: >-
      {{
        my_hash
        | default({})
        | combine({ item.availability_zone: item.subnet_id })
      }}
  loop: "{{ subnets }}"

- name: Print result
  debug:
    var: my_hash
           c1b28dc
date    
2016-02-01  291
2016-02-01  159
2016-02-02  322
2016-02-03  31
2016-02-10  8

但是当我合并它们时,我得到了:

            956773a
date    
2016-02-01  350
2016-02-01  27
2016-02-02  11
2016-02-02  8
2016-02-02  25

我想要的是:

           c1b28dc         956773a
date        
2016-02-01  291.0          350.0
2016-02-01  291.0          27.0
2016-02-01  159.0          350.0
2016-02-01  159.0          27.0
2016-02-02  322.0          11.0
2016-02-02  322.0          8.0
2016-02-02  322.0          25.0

我正在尝试使用concat,join和merge的不同方法,但是没有任何改善。

           c1b28dc         956773a
date        
2016-02-01  291.0          350.0
2016-02-01  159.0          27.0
2016-02-02  322.0          11.0
2016-02-02  NaN            8.0
2016-02-02  NaN            25.0
2016-02-03  31             NaN
2016-02-10  8              NaN

有帮助吗?

1 个答案:

答案 0 :(得分:1)

我在这里用cumcount分配了一个新密钥来帮助merge

df1=df1.assign(key=df1.groupby(level=0).cumcount()).reset_index()
df2=df2.assign(key=df2.groupby(level=0).cumcount()).reset_index()
df=df1.merge(df2,how='right')
# you can drop the columns by df=df.drop('key',1)
         date  c1b28dc  key  956773a
0  2016-02-01    291.0    0      350
1  2016-02-01    159.0    1       27
2  2016-02-02    322.0    0       11
3  2016-02-02      NaN    1        8
4  2016-02-02      NaN    2       25

更新

df1.merge(df2,how='outer').sort_values('date').drop('key',1)
        date  c1b28dc  956773a
0 2016-02-01    291.0    350.0
1 2016-02-01    159.0     27.0
2 2016-02-02    322.0     11.0
5 2016-02-02      NaN      8.0
6 2016-02-02      NaN     25.0
3 2016-02-03     31.0      NaN
4 2016-02-10      8.0      NaN