根据groupby值向pandas数据框添加新列

时间:2017-04-04 14:00:55

标签: python pandas

我有一个数据框:

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

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

它返回一个DataFrame,它是原始的全尺寸,并应用了转换函数。 请注意,在进行转换之前,我在'value'列上有子集,因为transform()适用于分组对象的完整列集。