Python 转换为与其最大值匹配的布尔列

Python 转换为与其最大值匹配的布尔列,python,pandas,Python,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

在这个岗位上帮忙的时候 ,我自己也有一个问题,对于这样的数据帧:

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的最后日期之外,所有行的第三列都为零?对于每个端点数据,它等于一

我编辑了我的答案,这样做:

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.

对我来说只需稍加修改即可:

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())的结果是一个系列,但该系列的索引是range(len(df))。当您尝试执行
newdf['new\u col']=new series
时,它会尝试匹配索引。强制转换为列表会使熊猫忽略索引,或者重置索引会首先将索引置于同一级别

另外,为了提高速度,您的数据似乎是按('id','date')排序的,这是一个很好的属性,可以使用(groupby对于大型dfs来说速度非常慢):

等等,那么groupby(“KEY”).agg(…)生成“KEY”索引,而groupby(“KEY”).transform(…)生成索引[0,1,2,3…]?
# 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