Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在多索引Groupby对象中填充Nan值_Python_Python 3.x_Pandas_Pivot Table - Fatal编程技术网

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

Python 在多索引Groupby对象中填充Nan值,python,python-3.x,pandas,pivot-table,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'],

我正在尝试创建一个多索引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
如下图所示,AOL.COM显示了除2017-2010年外每个月的观察结果。我想让AOL.COM显示一个带有NaN计数或零计数的观测值

尝试

接下来,我尝试通过定义日期范围,然后重新创建索引来使用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
我能猜到有办法

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')

您可以使用
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

你能解释一下第二段代码中的.astype('category')吗?@jonjon希望这个链接能有所帮助