Cambia el primer elemento de cada grupo en pandas DataFrame

Quiero asegurarme de que el primer valor de val2 correspondiente a cada vintage sea NaN . Actualmente dos ya son NaN , pero quiero asegurarme de que 0.53 también cambie a NaN .

 df = pd.DataFrame({ 'vintage': ['2017-01-01', '2017-01-01', '2017-01-01', '2017-02-01', '2017-02-01', '2017-03-01'], 'date': ['2017-01-01', '2017-02-01', '2017-03-01', '2017-02-01', '2017-03-01', '2017-03-01'], 'val1': [0.59, 0.68, 0.8, 0.54, 0.61, 0.6], 'val2': [np.nan, 0.66, 0.81, 0.53, 0.62, np.nan] }) 

Esto es lo que he intentado hasta ahora:

 df.groupby('vintage').first().val2 #This gives the first non-NaN values, as shown below vintage 2017-01-01 0.66 2017-02-01 0.53 2017-03-01 NaN df.groupby('vintage').first().val2 = np.nan #This doesn't change anything df.val2 0 NaN 1 0.66 2 0.81 3 0.53 4 0.62 5 NaN 

No puede asignar el resultado de una agregación, también first ignora el NaN existente, lo que puede hacer es llamar a head(1) que devolverá la primera fila para cada grupo, y pasar los índices a loc para enmascarar el origen df a sobrescribir esos valores de columna:

 In[91] df.loc[df.groupby('vintage')['val2'].head(1).index, 'val2'] = np.NaN df: Out[91]: date val1 val2 vintage 0 2017-01-01 0.59 NaN 2017-01-01 1 2017-02-01 0.68 0.66 2017-01-01 2 2017-03-01 0.80 0.81 2017-01-01 3 2017-02-01 0.54 NaN 2017-02-01 4 2017-03-01 0.61 0.62 2017-02-01 5 2017-03-01 0.60 NaN 2017-03-01 

Aquí puedes ver que head(1) devuelve la primera fila para cada grupo:

 In[94]: df.groupby('vintage')['val2'].head(1) Out[94]: 0 NaN 3 0.53 5 NaN Name: val2, dtype: float64 

contrasta con el first que devolverá el primer valor que no sea NaN a menos que solo haya valores de NaN para ese grupo:

 In[95]: df.groupby('vintage')['val2'].first() Out[95]: vintage 2017-01-01 0.66 2017-02-01 0.53 2017-03-01 NaN Name: val2, dtype: float64 

O crea la Posición, elige la primera, cambia val2 a np.nan

 df.loc[df.groupby('vintage').vintage.cumcount()==0,'val2']=np.nan df Out[154]: date val1 val2 vintage 0 2017-01-01 0.59 NaN 2017-01-01 1 2017-02-01 0.68 0.66 2017-01-01 2 2017-03-01 0.80 0.81 2017-01-01 3 2017-02-01 0.54 NaN 2017-02-01 4 2017-03-01 0.61 0.62 2017-02-01 5 2017-03-01 0.60 NaN 2017-03-01