Python 更新数据帧并添加考虑模式的缺失行

Python 更新数据帧并添加考虑模式的缺失行,python,pandas,Python,Pandas,我有一个数据帧: Date Scenario Value 2018-08-08 S1 120 2018-08-08 S2 132 2018-08-08 S3 127 2018-08-09 S1 114 2018-08-09 S3 107 2018-08-09 S4 201 ... 我想要的是: Date Scenario Value 201

我有一个数据帧:

Date         Scenario  Value
2018-08-08     S1       120
2018-08-08     S2       132
2018-08-08     S3       127
2018-08-09     S1       114
2018-08-09     S3       107
2018-08-09     S4       201
...
我想要的是:

Date         Scenario  Value
2018-08-08     S1       120
2018-08-08     S2       132
2018-08-08     S3       127
2018-08-08     S4        0
2018-08-09     S1       114
2018-08-08     S2        0
2018-08-09     S3       107
2018-08-09     S4       201
...

所以有一个模式。每天有4种情况。每个人都必须在那里!如果它们不存在,我需要创建一行,其中包含缺少的日期和场景,并将
0
分配给相应的
Value
列。有什么建议吗?谢谢

一种方法是使用前两列定义df2,然后使用:

pd.merge(df, df2, how='outer', on=['Date','Scenario']).fillna(0)

一种方法是使用前两列定义df2,然后使用:

pd.merge(df, df2, how='outer', on=['Date','Scenario']).fillna(0)

我们可以做
pivot
然后
stack

s=df.pivot(*df.columns).stack(dropna=False).fillna(0).reset_index()
s
         Date Scenario      0
0  2018-08-08       S1  120.0
1  2018-08-08       S2  132.0
2  2018-08-08       S3  127.0
3  2018-08-08       S4    0.0
4  2018-08-09       S1  114.0
5  2018-08-09       S2    0.0
6  2018-08-09       S3  107.0
7  2018-08-09       S4  201.0

我们可以做
pivot
然后
stack

s=df.pivot(*df.columns).stack(dropna=False).fillna(0).reset_index()
s
         Date Scenario      0
0  2018-08-08       S1  120.0
1  2018-08-08       S2  132.0
2  2018-08-08       S3  127.0
3  2018-08-08       S4    0.0
4  2018-08-09       S1  114.0
5  2018-08-09       S2    0.0
6  2018-08-09       S3  107.0
7  2018-08-09       S4  201.0

最近我不得不做一些非常类似的事情

您需要的是使用pd.date_范围,使用您希望约会的最长日期

date_range = pd.date_range(start=min_date, end=max_date)
df = df.set_index('Date').reindex(date_range).fillna(0).rename_axis('Date').reset_index()

你必须确保你在尽可能多的颗粒深度上做这件事

我最近也做了类似的事情

您需要的是使用pd.date_范围,使用您希望约会的最长日期

date_range = pd.date_range(start=min_date, end=max_date)
df = df.set_index('Date').reindex(date_range).fillna(0).rename_axis('Date').reset_index()

您必须确保以尽可能精细的深度执行此操作

创建一个包含所有可能的
场景
值的列表。从
l
df.Date
的唯一值构建一个多索引
idx
。最后,
set_index
on
Date
Scenario
并使用
idx
reset_index

l = ['S1', 'S2', 'S3', 'S4']
idx = pd.MultiIndex.from_product([df.Date.unique(), l])
(df.set_index(['Date', 'Scenario']).reindex(idx, fill_value=0)
                                   .rename_axis(['Date', 'Scenarios'])
                                   .reset_index())

Out[498]:
         Date Scenarios  Value
0  2018-08-08        S1    120
1  2018-08-08        S2    132
2  2018-08-08        S3    127
3  2018-08-08        S4      0
4  2018-08-09        S1    114
5  2018-08-09        S2      0
6  2018-08-09        S3    107
7  2018-08-09        S4    201


或者另一种方法是从上面的
idx
构造一个数据帧,并将
left
df
fillna
合并。但是,此方法不如上面的
reindex
方法干净。

创建一个包含所有可能
场景
值的列表。从
l
df.Date
的唯一值构建一个多索引
idx
。最后,
set_index
on
Date
Scenario
并使用
idx
reset_index

l = ['S1', 'S2', 'S3', 'S4']
idx = pd.MultiIndex.from_product([df.Date.unique(), l])
(df.set_index(['Date', 'Scenario']).reindex(idx, fill_value=0)
                                   .rename_axis(['Date', 'Scenarios'])
                                   .reset_index())

Out[498]:
         Date Scenarios  Value
0  2018-08-08        S1    120
1  2018-08-08        S2    132
2  2018-08-08        S3    127
3  2018-08-08        S4      0
4  2018-08-09        S1    114
5  2018-08-09        S2      0
6  2018-08-09        S3    107
7  2018-08-09        S4    201

或者另一种方法是从上面的
idx
构造一个数据帧,并将
left
df
fillna
合并。但是,此方法不如上面的
reindex
方法干净