Использование groupby
с пользовательской функцией, использующей pd.Series.isnull
:
def index_filter(x):
nulls = x.isnull()
n = nulls[nulls].index[0] - 1
return x.loc[:n]
res = df.groupby('id')['sales']\
.apply(index_filter).astype(int)\
.reset_index().drop('level_1', axis=1)
В качестве альтернативы, вы можете использовать выражение генератора с next
:
def index_filter(x):
n = next((i for i, j in enumerate(x) if np.isnan(j)), len(x))
return x.iloc[:n]
Результат:
print(res)
id sales
0 12 1
1 12 3
2 15 4
3 15 6
4 15 9