2017-04-04 157 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