Python 如何合并数据帧和填充值
我正在尝试合并下面的2个数据框,以获得一个输出,其中每个代码在每个日期列出,如果代码在该日期不在原始数据框中,则数量填充为0。我在下面举了一个输入和期望输出的例子,但我的实时数据将有超过一年的日期和超过20000个代码 输入数据: df1 df2 期望输出: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
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