python - 为 pandas 中的数据生成连续的缺失年份月份序列
问题描述
这是数据。对于每个人,它给出了他们当月所做的货币贡献:
df.head()
| year_mo | name | contribution|
| 202001 | Fey | 30 |
| 202003 | Fey | 20 |
| 202004 | Fey | 10 |
| 202001 | Jay | 30 |
| 202003 | Jay | 20 |
我想从 202001-202006 为每个人生成一个连续的 year_mo 系列,如果这个人没有做出贡献,它将是 0 像这样:
| year_mo | name | contribution|
| 202001 | Fey | 30 |
| 202002 | Fey | 0 |
| 202003 | Fey | 20 |
| 202004 | Fey | 10 |
| 202005 | Fey | 0 |
| 202006 | Fey | 0 |
| 202001 | Jay | 30 |
| 202002 | Jay | 0 |
| 202003 | Jay | 20 |
| 202004 | Jay | 0 |
| 202005 | Jay | 0 |
| 202006 | Jay | 0 |
为了做到这一点,我尝试使用连续的年月 df 进行外部连接,我尝试了以下操作,但没有得到所需的输出:
years = list(range(2020,2021,1))
months= list(range(1,7,1))
rows_list = []
for yr in years:
for mn in months:
dict1 = {}
dict1 = {'key' :1, 'year_mo' : (yr*100)+mn}
rows_list.append(dict1)
yearmo_df = pd.DataFrame(rows_list)
df['key'] = 1
new_df = pd.merge(left=df, right=yearmo_df, left_on='year_mo' ,right_on='year_mo', how='outer')
解决方案
我们可以使用MultiIndex
and reindex
:
new_idx = pd.MultiIndex.from_product([np.arange(202001,202007), df['name'].unique()],
names=['year_mo','name'])
(df.set_index(['year_mo', 'name'])
.reindex(new_idx, fill_value=0)
.sort_index(level=['name','year_mo'])
.reset_index()
)
另一个 optinopivot_table
后跟re_index
, 和stack
:
(df.pivot_table(index='year_mo', columns='name', fill_value=0)
.reindex(np.arange(202001,202007), fill_value=0)
.stack()
.reset_index()
)
输出:
year_mo name contribution
0 202001 Fey 30
1 202002 Fey 0
2 202003 Fey 20
3 202004 Fey 10
4 202005 Fey 0
5 202006 Fey 0
6 202001 Jay 30
7 202002 Jay 0
8 202003 Jay 20
9 202004 Jay 0
10 202005 Jay 0
11 202006 Jay 0
推荐阅读
- javascript - Web Components: Is there an equivalent to attributeChangedCallback for properties?
- swift - 具有圆形背景的自定义分段控件
- javascript - 有没有办法将 Firefox 的窗口宽度调整为 100 像素?或者有没有其他浏览器可以让我的窗口宽度低于 100 像素?
- android - 将 viewModelScope 与 LiveData 一起使用时出现问题
- r - 在 Shiny App 的 Filter dplyr 中将函数作为参数传递
- javascript - 添加自定义图像以在材质 ui 底部导航中制作图标
- autocomplete - Algolia 自动完成 - 如何以英语显示自动完成建议?
- java - 我使用数组和方法编写了一个代码来显示最小或最大数字的数字
- css - 无法使滑块响应
- php - MySQL + PHP:避免由于连接表中的两个结果而导致重复结果