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
onDate
和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
onDate
和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
方法干净