Python 计算熊猫中第一个事件的第n天
我有以下数据框,是我原始数据框的子集,包含列event、unixtime和day,我想添加另一列arbday,这是自第一个事件以来的第n天(第一次访问是第1天): 环顾四周后,我试图通过以下方式实现这一点:Python 计算熊猫中第一个事件的第n天,python,datetime,pandas,Python,Datetime,Pandas,我有以下数据框,是我原始数据框的子集,包含列event、unixtime和day,我想添加另一列arbday,这是自第一个事件以来的第n天(第一次访问是第1天): 环顾四周后,我试图通过以下方式实现这一点: >>> testdf2['arbday'] = np.where(testdf2['event']==1, 1, testdf2.day.apply(lambda x: x-x[:1])) event unixtime day
>>> testdf2['arbday'] = np.where(testdf2['event']==1, 1, testdf2.day.apply(lambda x: x-x[:1]))
event unixtime day arbday
343352 1 1346617885925 2012-09-02 1
343353 2 1346961625305 2012-09-06 NaN
343354 3 1347214217566 2012-09-09 NaN
or
>>> testdf2['arbday'] = np.where(testdf2['event']==1, 1, testdf2.day.apply(lambda x: dt.timedelta(x-x[:1])))
TypeError: 'datetime.date' object is not subscriptable
正确的方法是什么?非常感谢您的指点
编辑:关于将此应用于组的后续问题如下
输出:
event unixtime day arbday
0 1 1346617885925 2012-09-02 1
1 2 1346961625305 2012-09-06 5
2 3 1347214217566 2012-09-09 8
嗨,谢谢你的回答。但是,它在我的数据帧上不起作用,可能是因为它不是列day不是datetime对象(尽管我认为应该是)。请查看上面的编辑。您好@root,再次感谢您的更新。我让它在上面的虚拟数据帧上工作,它的索引为0,1,2。但在我的实际数据帧上,它不起作用,这是因为
df.get\u value(index,col)
将索引作为第一个参数。它在虚拟数据帧上工作的原因是'event'==1
在逻辑上为False,Python将False关联为0,因此在本例中返回索引[0]。如果将其更改为逻辑上为True的'event'=='event'
,它将返回第二天的datetime.date(2012,9,6)。我现在正试图找到一种方法返回访问1的索引。谢谢@root,这非常有帮助!作为后续问题,您将如何在组上应用相同的功能?(见最新问题)。再次感谢@S.zhen——你不应该通过更新来问“后续”问题。如果你有一个新问题,问一个新问题。问题/答案必须保持透明,这样才能使其他用户受益,他们可能有类似的问题,而不是成为个人教程。@root,对此表示抱歉。我把它换成原来的问题。我会在别的地方问我的新问题。谢谢
df = DataFrame({'event': range(1,4), 'unixtime': [1346617885925, 1346961625305,1347214217566]})
df['day'] = df['unixtime'].apply(lambda x: datetime.fromtimestamp(x/1000).date())
df['arbday']=df['day'].map(lambda x: (x-df.get_value(df[df.event == 1].first_valid_index(), 'day')).days+1)
print df
event unixtime day arbday
0 1 1346617885925 2012-09-02 1
1 2 1346961625305 2012-09-06 5
2 3 1347214217566 2012-09-09 8