Python Dask中的分组df滤波
关于熊猫的类似问题: 行动 基于应用于groupby列以外的列的表达式消除组 问题 未为分组数据帧实现筛选器 尝试过 Groupby和apply用于消除某些组,这些组会返回索引错误,因为apply函数应该总是返回某些内容Python Dask中的分组df滤波,python,pandas,dask,Python,Pandas,Dask,关于熊猫的类似问题: 行动 基于应用于groupby列以外的列的表达式消除组 问题 未为分组数据帧实现筛选器 尝试过 Groupby和apply用于消除某些组,这些组会返回索引错误,因为apply函数应该总是返回某些内容 In [16]: def filter_empty(df): if not df.label.values.all(4): return df df_nonempty = df_norm.groupby('hash').apply(filter_emp
In [16]:
def filter_empty(df):
if not df.label.values.all(4):
return df
df_nonempty = df_norm.groupby('hash').apply(filter_empty, meta=meta)
In [17]:
len(df_nonempty.hash.unique())
...
<ipython-input-16-6da6d9b6c069> in filter_empty()
1 def filter_empty(df):
----> 2 if not df.label.values.all(4):
3 return df
4
5 df_nonempty = df_norm.groupby('hash').apply(filter_empty, meta=meta)
/opt/conda/lib/python3.5/site-packages/numpy/core/_methods.py in _all()
39
40 def _all(a, axis=None, dtype=None, out=None, keepdims=False):
---> 41 return umr_all(a, axis, dtype, out, keepdims)
42
43 def _count_reduce_items(arr, axis):
ValueError: 'axis' entry is out of bounds
我认为您可以先+然后针对系列
(类似于,但也未在dask
中实现),最后通过以下方式进行过滤:
编辑: 我认为这里没有必要
groupby
:
df_notall4 = df[df.C != 4].drop_duplicates(subset=['A','D'])['D'].compute()
但如果真的需要:
def filter_4(x):
return x[x.C != 4]
df_notall4 = df.groupby('A').apply(filter_4, meta=df).D.unique().compute()
print (df_notall4)
0 1
1 3
2 0
3 5
Name: D, dtype: int64
感谢@jezrael,我检查了我的实现并创建了以下解决方案(请参见我提供的示例) 导致
In [8]:
df_notall4.D.unique().compute()
Out[8]:
0 1
1 3
2 5
3 0
Name: D, dtype: object
如果您根据大小进行过滤(如我提供的参考问题中所述),这是非常有用的。但是,您也知道如何将此应用于其他表达式。像;-伪-
如果group.label.values.all(4)
Hmmm,可以添加一些示例吗?因为不确定是否理解group.label.values.all(4)
-尤其是4
。感谢@jezrael的帮助!我添加了一个示例问题在4
中,您不能使用它。是否需要-df.B.values.all()
?是否可以添加所需的输出?因为如果不是df.B.values.all(4)
是错误的。您是否尝试重置groupby的_index(),然后过滤dask数据帧?
df_notall4 = df[df.C != 4].drop_duplicates(subset=['A','D'])['D'].compute()
def filter_4(x):
return x[x.C != 4]
df_notall4 = df.groupby('A').apply(filter_4, meta=df).D.unique().compute()
print (df_notall4)
0 1
1 3
2 0
3 5
Name: D, dtype: int64
df_notall4 = []
for d in list(df[df.C != 4].D.unique().compute()):
df_notall4.append(df.groupby('D').get_group(d))
df_notall4 = dd.concat(df_notall4, interleave_partitions=True)
In [8]:
df_notall4.D.unique().compute()
Out[8]:
0 1
1 3
2 5
3 0
Name: D, dtype: object