用python更有效地创建前n个值的dataframe

2024-04-16 15:55:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类别的数据框架,我需要通过将值限制到前n个类别来清理它。任何不在前n个类别中的值都应放在0(或“其他”)下。你知道吗

我尝试了下面的代码,它循环遍历一列的每一行,然后遍历数据帧中的每一列,以检查该位置的值是否位于该列的前n个值\u counts中。如果是,则保留该值,如果不是,则替换为0。你知道吗

这种实现在技术上是可行的,但是当行数很大时,运行起来就太长了。在熊猫/numpy中实现这一点最快的方法是什么?你知道吗

z = pd.DataFrame(np.random.randint(1,4,size=(100000, 4)))
x=pd.DataFrame()    
n=10
for j in z:
    for i in z[j].index:     
        if z.at[i,j] in z[j].value_counts().head(n).index.tolist():
            x.at[i,j] = z.at[i,j]
        else:
            x.at[i,j]= 0
print(x) 

Tags: 数据方法代码innumpy框架dataframefor
1条回答
网友
1楼 · 发布于 2024-04-16 15:55:18

我认为可以使用^{}作为循环列,使用自定义函数^{}作为顶级值,使用^{}^{}作为布尔掩码来替换:

def f(x):
    y = x.value_counts().head(n).index
    return x.where(x.isin(y), 0)

print (z.apply(f))

与以下内容相同:

print (z.apply(lambda x: x.where(x.isin(x.value_counts().head(n).index), 0)))

样品:

#N =100000
N = 10
np.random.seed(123)
z = pd.DataFrame(np.random.randint(1,4,size=(N, 4)))
print (z)
   0  1  2  3
0  3  2  3  3
1  1  3  3  2
2  3  2  3  2
3  1  2  3  2
4  1  3  1  2
5  3  2  1  1
6  1  1  2  3
7  1  3  1  1
8  2  1  2  1
9  1  1  3  2

x=pd.DataFrame()    
n=2
for j in z:
    for i in z[j].index:     
        if z.at[i,j] in z[j].value_counts().head(n).index.tolist():
            x.at[i,j] = z.at[i,j]
        else:
            x.at[i,j]= 0
print(x) 
     0    1    2    3
0  3.0  2.0  3.0  0.0
1  1.0  3.0  3.0  2.0
2  3.0  2.0  3.0  2.0
3  1.0  2.0  3.0  2.0
4  1.0  3.0  1.0  2.0
5  3.0  2.0  1.0  1.0
6  1.0  0.0  0.0  0.0
7  1.0  3.0  1.0  1.0
8  0.0  0.0  0.0  1.0
9  1.0  0.0  3.0  2.0

print (z.apply(lambda x: x.where(x.isin(x.value_counts().head(n).index), 0)))
   0  1  2  3
0  3  2  3  0
1  1  3  3  2
2  3  2  3  2
3  1  2  3  2
4  1  3  1  2
5  3  2  1  1
6  1  0  0  0
7  1  3  1  1
8  0  0  0  1
9  1  0  3  2

^{}类似的解决方案:

print (z.apply(lambda x: np.where(x.isin(x.value_counts().head(n).index), x, 0)))
   0  1  2  3
0  3  2  3  0
1  1  3  3  2
2  3  2  3  2
3  1  2  3  2
4  1  3  1  2
5  3  2  1  1
6  1  0  0  0
7  1  3  1  1
8  0  0  0  1
9  1  0  3  2

相关问题 更多 >