使用一定数量的非NaN整数在PandasDataFrame中保留索引

假设我有以下数据框:

df1 = pd.DataFrame(data    = [1,np.nan,np.nan,1,1,np.nan,1,1,1], 
                   columns = ['X'], 
                   index   = ['a', 'a', 'a', 
                              'b', 'b', 'b',
                              'c', 'c', 'c'])
print(df1)
     X
a  1.0
a  NaN
a  NaN
b  1.0
b  1.0
b  NaN
c  1.0
c  1.0
c  1.0

我只想保留具有 2 个或更多非 NaN 条目的索引。在这种情况下,“a”条目只有一个非 NaN 值,所以我想删除它并让我的结果是:

     X
b  1.0
b  1.0
b  NaN
c  1.0
c  1.0
c  1.0

做这个的最好方式是什么?理想情况下,我也想要一些适用于 Dask 的东西,尽管通常如果它适用于 Pandas,它也适用于 Dask。

回答

让我们试试 filter

out = df.groupby(level=0).filter(lambda x : x.isna().sum()<=1)
     X
b  1.0
b  1.0
b  NaN
c  1.0
c  1.0
c  1.0

或者我们做 isin

df[df.index.isin(df.isna().sum(level=0).loc[lambda x : x['X']<=1].index)]
     X
b  1.0
b  1.0
b  NaN
c  1.0
c  1.0
c  1.0


回答

作为另一种选择,让我们尝试通过GroupBy.transform布尔索引进行过滤:

df1[df1['X'].isna().groupby(df1.index).transform('sum') <= 1]

     X
b  1.0
b  1.0
b  NaN
c  1.0
c  1.0
c  1.0

或者,几乎以同样的方式,

df1[df1.assign(X=df1['X'].isna()).groupby(level=0)['X'].transform('sum') <= 1]

     X
b  1.0
b  1.0
b  NaN
c  1.0
c  1.0
c  1.0

您也可以很好地将其与 Dask 一起使用。


回答

我是 dask 的新手,查看了一些示例和文档,但是以下内容似乎有效;

from dask import dataframe as dd 
sd = dd.from_pandas(df1, npartitions=3)

#converts X to boolean checking for isna() and the groupby on index and sum
s = sd.X.isna().groupby(sd.index).sum().compute()

#using the above we can boolean index to check if sum is less than 2 , then use loc

out_dd = sd.loc[list(s[s<2].index)]

out_dd.head(6,npartitions=-1)

     X
b  1.0
b  1.0
b  NaN
c  1.0
c  1.0
c  1.0


以上是使用一定数量的非NaN整数在PandasDataFrame中保留索引的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>