Выберите строки перед нулевым значением в каждой группе - PullRequest
0 голосов
/ 23 июня 2018

Как установить подмножество или выбрать строки до появления первого нулевого значения в определенном столбце для каждой группы?

пример

id sales
12   1
12   3
12    
12   5
15   4
15   6
15   9 
15   
15   1

и выберите только

df sales
12  1
12  3
15  4
15  6
15  9

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Один из способов - получить нулевые значения, groupby on ID, взять значение cumsum, чтобы все строки до первого значения NULL имели счетчик 0, а строки в и после первого - 1 или более, а затем выбрать их.IOW:

In [19]: df.loc[df["sales"].isnull().groupby(df["id"]).cumsum() < 1]
Out[19]: 
   id  sales
0  12    1.0
1  12    3.0
4  15    4.0
5  15    6.0
6  15    9.0
0 голосов
/ 23 июня 2018

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...