请注意,实际情况下州和国家之间的音量和组合要大得多,而不仅仅是值'usa'
使用以下数据帧:
import pandas as pd
data = pd.DataFrame({'state':['ny','sf','tx','ny','ny'],'country':['usa','usa','usa','usa','usa'],
'Date':['01/01/2020','01/01/2020','01/01/2020','01/02/2020','01/02/2020']})
我将数据分组以获得给定日期内按城市、国家的条目数:
group_data = data.groupby(['state','country','Date']).size().to_frame().reset_index()
得到:
| | state | country | Date | 0 |
|---:|:-------|:----------|:-----------|----:|
| 0 | ny | usa | 01/01/2020 | 1 |
| 1 | ny | usa | 01/02/2020 | 2 |
| 2 | sf | usa | 01/01/2020 | 1 |
| 3 | tx | usa | 01/01/2020 | 1 |
理想情况下,我希望在数据框中的每一个条目,填补日期缺失的整个范围max(data[' date '])和min(data[' date '])有值填充的子组状态和国家,不存在,所以,例如,它应该看起来像:
| | state | country | Date | 0 |
|---:|:-------|:----------|:-----------|----:|
| 0 | ny | usa | 01/01/2020 | 1 |
| 1 | ny | usa | 01/02/2020 | 2 |
| 2 | sf | usa | 01/01/2020 | 1 |
| 2 | sf | usa | 01/02/2020 | 0 |
| 3 | tx | usa | 01/01/2020 | 1 |
| 3 | tx | usa | 01/02/2020 | 0 |
2020年1月2日增加sf-usa和tx-usa两个条目,编号为0.
添加unstack
和stack
out = data.groupby(['state','country','Date']).size().unstack(fill_value=0).stack().reset_index()
Out[276]:
state country Date 0
0 ny usa 01/01/2020 1
1 ny usa 01/02/2020 2
2 sf usa 01/01/2020 1
3 sf usa 01/02/2020 0
4 tx usa 01/01/2020 1
5 tx usa 01/02/2020 0
您还可以使用pyjanitor
的complete
函数,以暴露显式缺失值;它还可以帮助存在重复的场景(这里不相关,因为groupby总是返回唯一):
# pip install pyjanitor
import pandas as pd
import janitor as jn
(data.groupby(['state', 'country', 'Date'], as_index = False)
.size()
.complete('state', 'country', 'Date')
.fillna(0)
# to preserve data as integers
.astype({'size':pd.Int64Dtype()})
)
state country Date size
0 ny usa 01/01/2020 1
1 ny usa 01/02/2020 2
2 sf usa 01/01/2020 1
3 sf usa 01/02/2020 0
4 tx usa 01/01/2020 1
5 tx usa 01/02/2020 0