Python 如何合并数据帧和填充值

Python 如何合并数据帧和填充值,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我正在尝试合并下面的2个数据框,以获得一个输出,其中每个代码在每个日期列出,如果代码在该日期不在原始数据框中,则数量填充为0。我在下面举了一个输入和期望输出的例子,但我的实时数据将有超过一年的日期和超过20000个代码 输入数据: df1 df2 期望输出: date code qty 03/05/2021 A 2 03/05/2021 B 0 04/05/2021 A 0 04/05/2021 B 1 05/05/2021 A 0 05/05/2021

我正在尝试合并下面的2个数据框,以获得一个输出,其中每个代码在每个日期列出,如果代码在该日期不在原始数据框中,则数量填充为0。我在下面举了一个输入和期望输出的例子,但我的实时数据将有超过一年的日期和超过20000个代码

输入数据:

df1

df2

期望输出:

date      code  qty
03/05/2021  A   2
03/05/2021  B   0
04/05/2021  A   0
04/05/2021  B   1
05/05/2021  A   0
05/05/2021  B   0
06/05/2021  A   5
06/05/2021  B   0
07/05/2021  A   4
07/05/2021  B   0
08/05/2021  A   5
08/05/2021  B   4
09/05/2021  A   0
09/05/2021  B   0
10/05/2021  A   6
10/05/2021  B   0
我尝试了以下合并,但得到的输出似乎不符合要求:

df_new = df1.merge(df2, how='left', on='date')


    date      code  qty
0   2021-05-03  A   2.0
1   2021-05-04  B   1.0
2   2021-05-05  NaN NaN
3   2021-05-06  A   5.0
4   2021-05-07  A   4.0
5   2021-05-08  A   5.0
6   2021-05-08  B   4.0
7   2021-05-09  NaN NaN
8   2021-05-10  A   6.0

这更适合于
重新索引
。创建所有组合,设置索引,将索引重新索引为所有这些组合,填充NA,然后重置索引

import pandas as pd

idx = pd.MultiIndex.from_product([df1.date, df2['code'].unique()],
                                 names=['date', 'code'])

df2 = (df2.set_index(['date', 'code'])
          .reindex(idx)
          .fillna(0, downcast='infer')
          .reset_index())


code
df1
唯一VAL
之间执行
交叉连接。然后使用df.fillna()


一个带有
pivot
stack
的选项:

(df2.pivot_table(index='date', columns='code', fill_value=0)
    .reindex(df1.date, fill_value=0)
    .stack('code')
    .reset_index()
)
输出:

          date code  qty
0   2021-05-03    A    2
1   2021-05-03    B    0
2   2021-05-04    A    0
3   2021-05-04    B    1
4   2021-05-05    A    0
5   2021-05-05    B    0
6   2021-05-06    A    5
7   2021-05-06    B    0
8   2021-05-07    A    4
9   2021-05-07    B    0
10  2021-05-08    A    5
11  2021-05-08    B    4
12  2021-05-09    A    0
13  2021-05-09    B    0
14  2021-05-10    A    6
15  2021-05-10    B    0

我想你想要所有日期和代码的组合,对吗?是的,我正在尝试获取所有日期和代码的组合我认为应该是来自产品的
([df1.date.unique()+df2.date.unique(),df2.code.unique()]
@FloLie对于日期,因为它是一个
'left'
合并,我假设基础只应该是df1。代码可以这样做,但是如果只有2个,并且可能在df2中丢失了,那么只指定它们可能更安全。很好的一个,可能将
['a','B']
替换为
df2.code.unique()
?@ALollz,你是对的,这取决于假设。对于日期,如果df1是一个完整的日历,那么它是正确的,但是对于代码,我会将[“a”,“B”]标记为一个名为all_code的变量,或者从df2中获取唯一的值
          date code  qty
0   2021-05-03    A    2
1   2021-05-03    B    0
2   2021-05-04    A    0
3   2021-05-04    B    1
4   2021-05-05    A    0
5   2021-05-05    B    0
6   2021-05-06    A    5
7   2021-05-06    B    0
8   2021-05-07    A    4
9   2021-05-07    B    0
10  2021-05-08    A    5
11  2021-05-08    B    4
12  2021-05-09    A    0
13  2021-05-09    B    0
14  2021-05-10    A    6
15  2021-05-10    B    0
In [480]: x = pd.DataFrame(df2.code.unique())

In [483]: y = df1.assign(key=1).merge(x.assign(key=1), on='key').drop('key', 1).rename(columns={0: 'code'})

In [486]: res = y.merge(df2, how='left').fillna(0)

In [487]: res
Out[487]: 
          date code  qty
0   2021-05-03    A  2.0
1   2021-05-03    B  0.0
2   2021-05-04    A  0.0
3   2021-05-04    B  1.0
4   2021-05-05    A  0.0
5   2021-05-05    B  0.0
6   2021-05-06    A  5.0
7   2021-05-06    B  0.0
8   2021-05-07    A  4.0
9   2021-05-07    B  0.0
10  2021-05-08    A  5.0
11  2021-05-08    B  4.0
12  2021-05-09    A  0.0
13  2021-05-09    B  0.0
14  2021-05-10    A  6.0
15  2021-05-10    B  0.0
(df2.pivot_table(index='date', columns='code', fill_value=0)
    .reindex(df1.date, fill_value=0)
    .stack('code')
    .reset_index()
)
          date code  qty
0   2021-05-03    A    2
1   2021-05-03    B    0
2   2021-05-04    A    0
3   2021-05-04    B    1
4   2021-05-05    A    0
5   2021-05-05    B    0
6   2021-05-06    A    5
7   2021-05-06    B    0
8   2021-05-07    A    4
9   2021-05-07    B    0
10  2021-05-08    A    5
11  2021-05-08    B    4
12  2021-05-09    A    0
13  2021-05-09    B    0
14  2021-05-10    A    6
15  2021-05-10    B    0