首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pandas:填充通过groupby对象迭代的缺失值

Pandas:填充通过groupby对象迭代的缺失值
EN

Stack Overflow用户
提问于 2018-08-31 03:38:17
回答 1查看 83关注 0票数 2

我有下面的数据集:

代码语言:javascript
复制
d = {'player': ['1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', 
'2', '2', '2', '2', '3', '3', '3', '3', '3'],
'session': ['a', 'a', 'b', np.nan, 'b', 'c', 'c', 'c', 'c', 'd', 'd', 
'e', 'e', np.nan, 'e', 'f', 'f', 'g', np.nan,  'g'],
'date': ['2018-01-01 00:19:05', '2018-01-01 00:21:07', 
'2018-01-01 00:22:07', '2018-01-01 00:22:15','2018-01-01 00:25:09', 
'2018-01-01 00:25:11', '2018-01-01 00:27:28', '2018-01-01 00:29:29', 
'2018-01-01 00:30:35', '2018-01-01 00:21:16', '2018-01-01 00:35:22', 
'2018-01-01 00:38:16', '2018-01-01 00:38:20', '2018-01-01 00:40:35', 
'2018-01-01 01:31:16', '2018-01-03 00:55:22', '2018-01-03 00:58:16', 
'2018-01-03 00:58:21', '2018-03-01 01:00:35', '2018-03-01 01:31:16']
}

#create dataframe
df = pd.DataFrame(data=d)
#change date to datetime
df['date'] =  pd.to_datetime(df['date']) 

df.head()

     player session        date
0       1       a 2018-01-01 00:19:05
1       1       a 2018-01-01 00:21:07
2       1       b 2018-01-01 00:22:07
3       1     NaN 2018-01-01 00:22:15
4       1       b 2018-01-01 00:25:09

所以,这是我的三篇专栏文章:

  1. 'player' -有三个玩家(1,2,3) - dtype = object
  2. 'session' (对象)。每个会话id将玩家已经实现的一组操作(即dataset中的行)组合在一起(datetime对象)来告诉我们每个操作被执行的时间( implemented.

这个数据集中的问题是,我有每个操作的时间戳,但有些操作缺少它们的会话id。我想要做的是:对于每个玩家,我想根据时间线为缺失值提供一个id标签。如果缺少id的动作落入某个会话的时间范围(第一个动作-最后一个动作)内,则可以对这些动作进行标记。

假设I groupby player & id,并计算每个会话的时间范围:

代码语言:javascript
复制
my_agg = df.groupby(['player', 'session']).date.agg([min, max])
my_agg

                           min                 max
player session                                        
1      a       2018-01-01 00:19:05 2018-01-01 00:21:07
       b       2018-01-01 00:22:07 2018-01-01 00:25:09
       c       2018-01-01 00:25:11 2018-01-01 00:30:35
2      d       2018-01-01 00:21:16 2018-01-01 00:35:22
       e       2018-01-01 00:38:16 2018-01-01 01:31:16
3      f       2018-01-03 00:55:22 2018-01-03 00:58:16
       g       2018-01-03 00:58:21 2018-03-01 01:31:16

在这一点上,我想遍历每个玩家,并逐个会话地比较我的NaN值的时间戳,看看它们属于哪里。

Desired output:在本例中,第一个Nan应标记为'b',第二个应标记为'e‘,最后一个应标记为'g’。

免责声明:几天前我问了一个类似的问题,(see here),得到了一个非常好的答案,但这一次我必须考虑另一个变量,我又被卡住了。事实上,Python的第一步是令人兴奋的,但非常具有挑战性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-31 05:46:24

您的示例已经排序,但是即使在您的输入未排序的情况下,这也应该会产生您想要的结果。如果此答案不能满足您的要求,请在违反您的要求的情况下发布一个附加的(或修改后的)样本数据帧以及预期的输出。

代码语言:javascript
复制
df.sort_values(['player','date']).fillna(method='ffill')

收益率:

代码语言:javascript
复制
   player session                date
0       1       a 2018-01-01 00:19:05
1       1       a 2018-01-01 00:21:07
2       1       b 2018-01-01 00:22:07
3       1       b 2018-01-01 00:22:15
4       1       b 2018-01-01 00:25:09
5       1       c 2018-01-01 00:25:11
6       1       c 2018-01-01 00:27:28
7       1       c 2018-01-01 00:29:29
8       1       c 2018-01-01 00:30:35
9       2       d 2018-01-01 00:21:16
10      2       d 2018-01-01 00:35:22
11      2       e 2018-01-01 00:38:16
12      2       e 2018-01-01 00:38:20
13      2       e 2018-01-01 00:40:35
14      2       e 2018-01-01 01:31:16
15      3       f 2018-01-03 00:55:22
16      3       f 2018-01-03 00:58:16
17      3       g 2018-01-03 00:58:21
18      3       g 2018-03-01 01:00:35
19      3       g 2018-03-01 01:31:16
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52104260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档