如何在python中的groupby之后填充数据帧的0和NaN?

时间:2017-10-28 09:32:33

标签: python pandas dataframe group-by data-processing

在我将它们分组后,我的数据框看起来像这样。

gb = new_user_log.groupby(['msno', 'date', 'num_25', 'num_50',
                          'num_75', 'num_985', 'num_100',
                          'num_unq', 'total_secs', 'days']).days.count()

部分数据框显示在此处:

  msno                                          date        num_25  num_50  num_75  num_985  num_100  num_unq  total_secs  days
    ++orpnUqSevh2M5A97pRRiONA58g5m9DwaNrhD44HY0=  2016-08-14  78      13      3       3        77       84       18987.862   2       1
    +0krxpTkQT7hciN95OEp7i2lyKvbXft887VNQGF6xN4=  2016-12-22  27      23      5       2        11       65       5946.577    35      1
                                                                                                                             98      1
    +1eAmfPiXsMG0J+U/j7YTeXO+u0/ZhZqmoXfXKOY57I=  2016-12-17  8       2       2       2        126      131      32629.128   46      1
    +1zyLKrstPYDOnoyooqqb0+VmmovONd9N3QZynT7rq0=  2016-07-14  18      2       1       3        46       66       10253.571   196     1
                                                  2016-09-17  11      3       1       6        81       45       12970.416   261     1
                                                  2016-11-17  5       1       3       2        8        19       2614.571    322     1
    +28j7X4BShC9g2C4No4xAmzXuhLlmMbFDYWZcbblCEs=  2015-11-21  1       2       1       2        88       94       23580.548   45      1
                                                  2016-03-28  12      6       5       4        36       61       11596.887   173     1
    +2GtgQNpMuIG0Vy1ycAbfla0zRni6NKtRLlyyuHHB8I=  2015-07-18  15      1       2       2        73       75       19179.451   102     1
                                                  2016-07-29  7       2       1       1        8        17       2515.486    479     1
                                                  2016-11-09  45      6       3       1        71       93       19865.317   582     1

所以我希望解决的第一个小问题是给每个'msno'(userID)一个数字,而不是字符串类型......

所有这些功能num_25 num_50 num_75 num_985 num_100 num_unq total_secs都计算每天发生的事件。

最后一项功能daysdays = date - transaction_date计算,表示用户拥有该产品的天数。每个用户的第一个transaction_date表示第一次购买此产品。它来自下面的数据框,

                                                msno  payment_method_id  \
0       QA7uiXy8vIbUSPOkCf9RwQ3FsT8jVq2OxDr8zqa7bRQ=                 39   
20      GBy8qSz16X5iYWD+3CMxv/Hm6OPSrXBYtmbnlRtknW0=                 33   
44      T0FF6lumjKcqEO0O+tUH2ytc+Kb9EkeaLzcVUiTr1aE=                 40   
72      9iW/UpqRoviya9CQh64RoYLPjiws8+biwscN+g5qYm4=                 37   
86      LUCi7i5FeNuZz4DB0zKu8J80rgr2uCO8YHCSW9PZfAk=                 38   
98      qCagaTL3UbMn0zvdMDDUoonbei70q1eASKrXa1cZGCs=                 38   
120     nsx5IGkCueevv0vFHB4jkG0HdRl6m6ltB8U9Guo5nS0=                 40   
123     nsx5IGkCueevv0vFHB4jkG0HdRl6m6ltB8U9Guo5nS0=                 40   


      transaction_date membership_expire_date  
0            2016-10-31             2016-12-21    
20           2016-03-31             2016-04-30  
44           2015-03-28             2015-04-27  
72           2015-05-04             2015-06-03   
86           2016-03-13             2016-08-24  
98           2015-03-20             2015-04-19   
120          2016-04-07             2016-05-06   
123          2017-01-01             2017-02-06   

您可以在days中看到每个用户只有几个值。那么是否可以用0填充事件的所有其他日子以将数据帧扩展为非常稀疏的数据帧?我必须遵循的规则是在days列中找到最大值(在此示例中为582),然后在没有事件发生的情况下为这些事件列下的每个用户填充所有582天的0。 / p>

从标题我说填充NaN,因为一些用户有多个transcation_datemembership_expire_date记录(参见最后两行)。例如,我想计算用户之间的第二个transcation_date - 第一个membership_expire_date(类似于days的方式)之间的差异,然后在此范围时间内填写NaN the third starts - the second ends(对于某些用户来说,即使是大约30个,也可能有很多范围时间)。因此应该填充两种类型的值,0和NaN。

我不知道我是否清楚地提出了这些问题,确实很多......如果有人能帮助我,甚至给我一些提示,你一定是我的救星!

0 个答案:

没有答案