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

时间:2014-07-17 20:42:28

标签: python pandas

帮助完成这篇文章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.

1 个答案:

答案 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