Python Dask.dataframe或其他:删除低频项行的可扩展方式

Python Dask.dataframe或其他:删除低频项行的可扩展方式,python,pandas,dask,Python,Pandas,Dask,我正在寻找一种从包含低频项的数据帧中删除行的方法。我改编了博文中的以下片段: 不过,这实际上并不适用于达斯克。它在不常用项.keys()处出错。 即使它确实有效,考虑到这与优雅相反,我怀疑一定有更好的方法 你能提出一些建议吗?不确定这是否能帮到你,但它太大了,无法发表评论: df = pd.DataFrame(np.random.randint(0, high=20, size=(30,2)), columns = ['A', 'B']) unique, counts = np.unique(d

我正在寻找一种从包含低频项的数据帧中删除行的方法。我改编了博文中的以下片段:

不过,这实际上并不适用于达斯克。它在
不常用项.keys()处出错。

即使它确实有效,考虑到这与优雅相反,我怀疑一定有更好的方法


你能提出一些建议吗?

不确定这是否能帮到你,但它太大了,无法发表评论:

df = pd.DataFrame(np.random.randint(0, high=20, size=(30,2)), columns = ['A', 'B'])
unique, counts = np.unique(df.values.ravel(), return_counts=True)
d = dict(zip(unique, counts))
threshold = 10
to_remove = [k for k, v in d.items() if v < threshold]
df.replace(to_remove, np.nan, inplace=True)
df=pd.DataFrame(np.random.randint(0,高=20,大小=(30,2)),列=['A','B'])
unique,counts=np.unique(df.values.ravel(),return_counts=True)
d=dict(zip(唯一,计数))
阈值=10
to_remove=[k代表k,d中的v.items(),如果v<阈值]
df.替换(要移除,np.nan,就地=真)
见:


“玩具问题”显示,在您提到的步骤中,从400 us到10 us的速度提高了40倍。

以下代码结合了Evan的改进,解决了我的问题:

unique, counts = np.unique(df.values.ravel(), return_counts=True)
d = dict(zip(unique, counts))

to_remove = {k for k, v in d.items() if v < threshold}

mask = df.isin(to_remove)

column_mask = (~mask).all(axis=1)

df = df[column_mask]

不幸的是,在最后一行(
df.replace(to_remove,np.nan,inplace=True)
)仍然需要很长时间。我在几个小时后终止了进程。你知道数据帧的
消耗了多少时间吗?替换
?我的数据框是带字符串的分类数据类型。好吧,前进!看看这个?使用
.map
.applymap
可能更快;显然,
df.replace()
很慢,但我不知道为什么。要与dask一起使用,您很可能希望尝试“分区”和“块”是否相同?在其他上下文中,函数有一个
chunksize
参数。是的,这两个参数通常是同义词。
df = pd.DataFrame(np.random.randint(0, high=20, size=(30,2)), columns = ['A', 'B'])
unique, counts = np.unique(df.values.ravel(), return_counts=True)
d = dict(zip(unique, counts))
threshold = 10
to_remove = [k for k, v in d.items() if v < threshold]
df.replace(to_remove, np.nan, inplace=True)
unique, counts = np.unique(df.values.ravel(), return_counts=True)
d = dict(zip(unique, counts))

to_remove = {k for k, v in d.items() if v < threshold}

mask = df.isin(to_remove)

column_mask = (~mask).all(axis=1)

df = df[column_mask]
def filter_low_frequency(df, threshold=4):
    unique, counts = np.unique(df.values.ravel(), return_counts=True)
    d = dict(zip(unique, counts))
    to_remove = {k for k, v in d.items() if v < threshold}
    mask = df.isin(to_remove)
    column_mask = (~mask).all(axis=1)
    df = df[column_mask]
    return df


df = pd.DataFrame(np.random.randint(0, high=20, size=(10,10)))
print(df)
print(df.stack().value_counts())
df = filter_low_frequency(df)
print(df)
    0   1   2   3   4   5   6   7   8   9
0   3  17  11  13   8   8  15  14   7   8
1   2  14  11   3  16  10  19  19  14   4
2   8  13  13  17   3  13  17  18   5  18
3   7   8  14   9  15  12   0  15   2  19
4   6  12  13  11  16   6  19  16   2  17
5   2   1   2  17   1   3  12  10   2  16
6   0  19   9   4  15   3   3   3   4   0
7  18   8  15   9   1  18  15  17   9   0
8  17  15   9  11  13   9  11   4  19   8
9  13   6   7   8   8  10   0   3  16  13
8     9
3     8
13    8
17    7
15    7
19    6
2     6
9     6
11    5
16    5
0     5
18    4
4     4
14    4
10    3
12    3
7     3
6     3
1     3
5     1
dtype: int64
    0   1  2   3   4  5   6  7   8  9
6   0  19  9   4  15  3   3  3   4  0
8  17  15  9  11  13  9  11  4  19  8