2017-04-04 165 views
2

我有一个数据帧:新列添加到基于GROUPBY值大熊猫据帧

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

您可以使用DataFrameGroupBy.idxmin查找group中的最小索引,然后通过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 
+0

很好的答案。我当然会接受它。 –

+0

非常感谢。很高兴可以帮助你。 – jezrael

1

使用transform()方法的对象的GroupBy的:

df['ismin'] = df.groupby('date')['value'].transform(lambda x: x == np.min(x)) 

它返回一个数据帧的原始的全尺寸应用了变换函数。 请注意,由于transform()适用于分组对象的完整列集,所以在执行转换之前,我在'值'列上有子集。

+0

非常有趣,它实际上工作。我的问题是你的lambda表达式中的'x'是什么?它是该组还是该组中的每个元素? –

+0

'transform()'将函数作为需要数据框的参数,因此在这种情况下'x'是为每个组生成的分组数据框。 它只会包含一列:'value',因为它在之前的步骤中已被切片。 – saxelsen