在多索引Groupby对象中填充Nan值

时间:2018-02-16 21:29:29

标签: python python-3.x pandas pivot-table

我正在尝试创建一个多索引groupby对象,该对象接收电子邮件域并按月查找百分比变化。当一个月没有观察时,我遇到了问题。

原始数据框

tracking_df = tracking_df[['transaction_mm_yy', 'ST_Email_Domain', 'isFraud', 'order_number']]

我创建了一个数据透视表,结果如下:

tracking_df.pivot_table(index=['transaction_mm_yy', 'ST_Email_Domain'], 
`columns='isFraud', values='order_number', aggfunc='count')`

                   isFraud              1
transaction_mm_yy  ST_Email_Domain
2017-10            GMAIL.COM           31.0
                   HOTMAIL.COM          2.0
                   TSF.COM              9.0
                   MAIL.COM             3.0
                   OUTLOOK.COM        214.0
                   YAHOO.COM           20.0
2017-11            AOL.COM              3.0
                   GMAIL.COM           14.0
                   HOTMAIL.COM          9.0
                   TSF.COM              5.0
                   MAIL.COM             9.0
                   OUTLOOK.COM         14.0
                   YAHOO.COM           62.0
2017-12            AOL.COM             21.0
                   GMAIL.COM          101.0
                   HOTMAIL.COM         13.0
                   TSF.COM              8.0
                   MAIL.COM            11.0
                   OUTLOOK.COM         14.0
                   YAHOO.COM           41.0
2018-01            AOL.COM              7.0
                   GMAIL.COM           88.0
                   HOTMAIL.COM          8.0
                   TSF.COM             21.0
                   MAIL.COM             2.0
                   OUTLOOK.COM          8.0
                   YAHOO.COM           13.0

如下所示,除2017-10外,AOL.COM每月都会显示观察结果。我希望AOL.COM能够显示NaN计数或零计数的观察结果。

尝试

documentation之后,我尝试使用 reindex 定义日期范围,然后重新创建索引。

date_index2 = pd.date_range(start_date_range, periods=4, freq='m')
date_index2.strftime('%Y-%m').tolist()

tracking_df.reindex(date_index2, fill_value=0)

然而,我收到错误:

ValueError: cannot include dtype 'M' in a buffer

我可以猜到

2 个答案:

答案 0 :(得分:1)

有方法

s.unstack().stack(dropna=False).fillna(0)
Out[774]: 
transaction_mm_yy  ST_Email_Domain
2017-10            AOL.COM              0.0
                   GMAIL.COM           31.0
                   HOTMAIL.COM          2.0
                   MAIL.COM             3.0
                   OUTLOOK.COM        214.0
                   TSF.COM              9.0
                   YAHOO.COM           20.0
2017-11            AOL.COM              3.0
                   GMAIL.COM           14.0
                   HOTMAIL.COM          9.0
                   MAIL.COM             9.0
                   OUTLOOK.COM         14.0
                   TSF.COM              5.0
                   YAHOO.COM           62.0
dtype: float64

另一种方法是在开头使用类别数据

tracking_df.ST_Email_Domain=tracking_df.ST_Email_Domain.astype('category')

tracking_df.pivot_table(index=['transaction_mm_yy', 'ST_Email_Domain'], 
`columns='isFraud', values='order_number', aggfunc='count')

答案 1 :(得分:0)

reindex df.index.levels df。这假设您已将数据透视表分配到df.reindex(pd.MultiIndex.from_product(df.index.levels)) isFraud 1 2017-10 AOL.COM NaN GMAIL.COM 31.0 HOTMAIL.COM 2.0 MAIL.COM 3.0 OUTLOOK.COM 214.0 TSF.COM NaN YAHOO.COM 20.0 vTSF.COM 9.0 2017-11 AOL.COM 3.0 GMAIL.COM 14.0 HOTMAIL.COM 9.0 MAIL.COM 9.0 OUTLOOK.COM 14.0 TSF.COM 5.0 YAHOO.COM 62.0 vTSF.COM NaN 2017-12 AOL.COM 21.0 GMAIL.COM 101.0 HOTMAIL.COM 13.0 MAIL.COM 11.0 OUTLOOK.COM 14.0 TSF.COM 8.0 YAHOO.COM 41.0 vTSF.COM NaN 2018-01 AOL.COM 7.0 GMAIL.COM 88.0 HOTMAIL.COM 8.0 MAIL.COM 2.0 OUTLOOK.COM 8.0 TSF.COM 21.0 YAHOO.COM 13.0 vTSF.COM NaN

{{1}}