全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 python论坛
2867 5
2016-06-21
各位大大好,我现在有一个全是浮点数的dataframe,我想保留每列最大的十个数值,其他的数值全部赋为0,有方法能办到么
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-7-2 02:09:08
如果用pandas库可以做以下:(不知速度如何,可能有点笨,超过100万行可能会有点慢。高人可以优化一下算法)
import pandas as pd
data= pd.DataFrame(np.random.randn(15, 5),columns=['a', 'b', 'c', 'd', 'e']) #产生15行5列的随机数据
print data #显示处理前data
for e in list(data): #遍历每一列
    big10 = np.sort(np.array(data[e].unique()))[len(data)-10] #找出第10大的数字,存在big10里
    data.loc[data[e]<big10,e]=0 #小于big10的全设为0
print data   #显示处理后data

处理前:
         a            b             c              d            e
0   2.011566 -0.054574  0.089393 -2.248325  0.129237
1   0.562928  0.330970  0.010073 -0.920446  0.011367
2  -0.261404  0.847595 -0.998905 -1.161190 -0.944618
3   1.199322  1.418023 -0.334839  0.959855  1.300455
4   1.142549  0.293600 -1.462528  0.301034 -0.872144
5  -1.038400 -0.345969 -0.118284 -0.879187 -0.107377
6  -0.343097  0.422327  0.174909 -0.287656  1.530969
7   0.464041 -1.111023  0.879336  0.265647 -0.299637
8  -0.540274 -0.194963 -0.170589 -0.909901  1.359518
9  -0.754304  0.236669  0.214655 -0.538768  0.349819
10 -0.402359  0.818792 -0.689648  0.305897 -1.367814
11 -1.152727  0.719951 -0.943549  2.068480  0.664024
12  0.748543  1.340917 -0.473513  0.128526 -0.822395
13  1.801340 -0.021896 -0.050744  1.114119  0.516203
14 -0.415765 -2.561390  2.613543  0.427538  0.929893

处理后:
           a         b             c              d             e
0   2.011566  0.000000  0.089393  0.000000  0.129237
1   0.562928  0.330970  0.010073  0.000000  0.011367
2  -0.261404  0.847595  0.000000  0.000000  0.000000
3   1.199322  1.418023 -0.334839  0.959855  1.300455
4   1.142549  0.293600  0.000000  0.301034  0.000000
5   0.000000  0.000000 -0.118284  0.000000 -0.107377
6  -0.343097  0.422327  0.174909 -0.287656  1.530969
7   0.464041  0.000000  0.879336  0.265647  0.000000
8   0.000000  0.000000 -0.170589  0.000000  1.359518
9   0.000000  0.236669  0.214655 -0.538768  0.349819
10 -0.402359  0.818792  0.000000  0.305897  0.000000
11  0.000000  0.719951  0.000000  2.068480  0.664024
12  0.748543  1.340917  0.000000  0.128526  0.000000
13  1.801340 -0.021896 -0.050744  1.114119  0.516203
14  0.000000  0.000000  2.613543  0.427538  0.929893

注:如果你的原始数据是csv文件,可在第一步用data=pd.read_csv("路径+文件名.csv") 代替

希望满足你的需要!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-2 02:36:38
我写了段代码po上来,咋没显示呢?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-2 03:51:23

如果用pandas库可以做以下:(不知速度如何,可能有点笨,超过100万行可能会有点慢。高人可以优化一下算法)
import pandas as pd
import numpy as np
data= pd.DataFrame(np.random.randn(15, 5),columns=['a', 'b', 'c', 'd', 'e']) #随机产生15行5列的dataframe
print data #显示处理前数据
for e in list(data):#遍历所有列
    big10 = np.sort(np.array(data[e].unique()))[len(data)-10] #找出每一列的第10大数
    data.loc[data[e]<big10,e]=0 #小于这个的设为0
print data   #显示处理后数据


结果:
处理前:   
           a            b           c              d            e
0   2.011566 -0.054574  0.089393 -2.248325  0.129237
1   0.562928  0.330970  0.010073 -0.920446  0.011367
2  -0.261404  0.847595 -0.998905 -1.161190 -0.944618
3   1.199322  1.418023 -0.334839  0.959855  1.300455
4   1.142549  0.293600 -1.462528  0.301034 -0.872144
5  -1.038400 -0.345969 -0.118284 -0.879187 -0.107377
6  -0.343097  0.422327  0.174909 -0.287656  1.530969
7   0.464041 -1.111023  0.879336  0.265647 -0.299637
8  -0.540274 -0.194963 -0.170589 -0.909901  1.359518
9  -0.754304  0.236669  0.214655 -0.538768  0.349819
10 -0.402359  0.818792 -0.689648  0.305897 -1.367814
11 -1.152727  0.719951 -0.943549  2.068480  0.664024
12  0.748543  1.340917 -0.473513  0.128526 -0.822395
13  1.801340 -0.021896 -0.050744  1.114119  0.516203
14 -0.415765 -2.561390  2.613543  0.427538  0.929893
处理后:
           a             b          c               d             e
0   2.011566  0.000000  0.089393  0.000000  0.129237
1   0.562928  0.330970  0.010073  0.000000  0.011367
2  -0.261404  0.847595  0.000000  0.000000  0.000000
3   1.199322  1.418023 -0.334839  0.959855  1.300455
4   1.142549  0.293600  0.000000  0.301034  0.000000
5   0.000000  0.000000 -0.118284  0.000000 -0.107377
6  -0.343097  0.422327  0.174909 -0.287656  1.530969
7   0.464041  0.000000  0.879336  0.265647  0.000000
8   0.000000  0.000000 -0.170589  0.000000  1.359518
9   0.000000  0.236669  0.214655 -0.538768  0.349819
10 -0.402359  0.818792  0.000000  0.305897  0.000000
11  0.000000  0.719951  0.000000  2.068480  0.664024
12  0.748543  1.340917  0.000000  0.128526  0.000000
13  1.801340 -0.021896 -0.050744  1.114119  0.516203
14  0.000000  0.000000  2.613543  0.427538  0.929893


注:如果你的原始数据是csv等文件,可以data=pd.read_csv(“路径名+文件名.csv”)导入数据,用data.to_csv("路径名+新文件名.csv",index=False)导出 处理后的文件。

希望有所帮助!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-5 14:54:06
tsdxwwdz888 发表于 2016-7-2 03:51
如果用pandas库可以做以下:(不知速度如何,可能有点笨,超过100万行可能会有点慢。高人可以优化一下算法 ...
谢谢,我找到了一个更简便的办法,就是用pd.rank得到每一列的排序序号,然后把序号大于10的全赋值0
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-5 23:08:25
patrick918 发表于 2016-7-5 14:54
谢谢,我找到了一个更简便的办法,就是用pd.rank得到每一列的排序序号,然后把序号大于10的全赋值0
好方法!我都不知道有rank这个函数
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群