首页 > 解决方案 > 为 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')

标签: pythonpython-3.xpandasdataframe

解决方案


我们可以使用MultiIndexand 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

推荐阅读