帮助完成这篇文章Generating new time series index from existing data set in Pandas 我自己也有一个问题,对于像这样的数据框:
In [44]: newdf
Out[44]:
date
id
3001 2000-01-01
3001 2000-01-02
3001 2000-01-03
3001 2000-01-04
3001 2000-01-05
3849 2001-01-05
3849 2001-01-06
3849 2001-01-07
3849 2001-01-08
8927 2006-01-06
8927 2006-01-07
8927 2006-01-08
8927 2006-01-09
如何添加第三列,对于所有行都是零,但每个ID的最后日期是?对于每个end_data,它等于一个?
我编辑了我的答案:
In [32]: b = newdf.reset_index().groupby( 'id').date.transform(
lambda ii : ii.max())
In [37]: newdf['new_col'] = (newdf.date == b).astype(int)
但我不知道为什么我不能这样做:
newdf['new_col'] = newdf.reset_index().groupby( 'id').date.transform( lambda ii : ii == ii.max())
给了我错误:
ValueError: new type not compatible with array.
答案 0 :(得分:0)
稍微修改一下对我有用:
newdf['new_col'] = [v for v in newdf.reset_index().groupby( 'id').date.transform( lambda ii : ii == ii.max())]
或者,或者:
df2 = newdf.reset_index()
df2['new_col'] = df2.groupby( 'id').date.transform( lambda ii : ii == ii.max())
....groupby( 'id').date.transform( lambda ii : ii == ii.max())
的结果是一个系列,但该系列的索引是范围(len(df))。当您尝试执行newdf['new_col'] = new series
时,它会尝试匹配索引。转换为列表会使pandas忽略索引,或者重新设置索引会首先将索引放在同一级别上。
作为旁注,对于速度而言,您的数据似乎按(' id',' date')进行排序,这是一个不错的属性(groupby得到真正的对于大型dfs来说很慢):
# guarantee sorting
newdf.reset_index(inplace=True).sort(('id','date'), inplace=True).set_index('id')
# init new column
newdf['is_last'] = 0
curr_id = None
for i, (id, row) in enumerate(newdf.iterrows()):
if i > 0 and id != curr_id:
newdf.iloc[i-1]['is_last'] = 1