在每个组中选择空值之前的行

时间:2018-06-23 15:22:57

标签: python pandas dataframe pandas-groupby

对于每个组,如何在特定列的第一个空值出现之前对行进行子集或选择?

示例

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 :(得分:1)

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

答案 1 :(得分:1)

一种方法是获取空值,对ID进行分组,获取总和,以使第一个空值之前的所有行的计数为0,而第一个空值之后的行的计数为1或更多,然后选择这些行。爱荷华州:

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