基于groupby值向Pandas dataframe添加新列

3

I have a dataframe:

  date                value
1/1/2017               -3
1/1/2017               -1 
1/1/2017                5 
1/2/2017                4
1/2/2017                9
1/2/2017               -1

我想要做的是添加一个额外的列,is_min,如果该值是当天最小值,则将其设置为1,否则为0

因此结果应该如下:

 date                 value            is_min
1/1/2017               -3                1
1/1/2017               -1                0 
1/1/2017                5                0 
1/2/2017                4                0
1/2/2017                9                0 
1/2/2017               -1                1

我尝试了一些类似于以下的东西:

df['is_min']=df['value']==df.groupby('date')['value'].min()

但是,当然,df['value']df.groupby('date')['value'].min()的长度不匹配...

2个回答

2

您可以使用DataFrameGroupBy.idxmingroup中查找最小索引,然后通过isin测试成员身份:

df['is_min'] = df.index.isin(df.groupby('date')['value'].idxmin()).astype(int)
print (df)
       date  value  is_min
0  1/1/2017     -3       1
1  1/1/2017     -1       0
2  1/1/2017      5       0
3  1/2/2017      4       0
4  1/2/2017      9       0
5  1/2/2017     -1       1

df['is_min'] = 0
df.loc[df.index.isin(df.groupby('date')['value'].idxmin()), 'is_min'] = 1
print (df)
       date  value  is_min
0  1/1/2017     -3       1
1  1/1/2017     -1       0
2  1/1/2017      5       0
3  1/2/2017      4       0
4  1/2/2017      9       0
5  1/2/2017     -1       1

非常感谢。很高兴能帮到您。 - jezrael

1
使用GroupBy对象的transform()方法:
df['ismin'] = df.groupby('date')['value'].transform(lambda x: x == np.min(x)) 

它返回一个DataFrame,其大小与原始数据相同,并应用变换函数。请注意,在进行变换之前,我已经在'value'列上进行了子集操作,因为transform()是在分组对象的完整列集上应用的。

非常有趣并且它确实有效。我的问题是你的lambda表达式中的x是什么?它是指组还是组中的每个元素? - Binyamin Even
transform() 接受一个函数作为参数,该函数期望一个数据框作为输入,因此在这种情况下 x 是为每个组生成的分组数据框。 它只包含一列:value,因为在之前的步骤中已经进行了切片。 - saxelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接