楼主: patrick918
2590 5

[问答] 求助一个关于DataFrame排序相关的问题 [推广有奖]

  • 0关注
  • 0粉丝

VIP1

大专生

86%

还不是VIP/贵宾

-

威望
0
论坛币
3477 个
通用积分
0
学术水平
1 点
热心指数
0 点
信用等级
0 点
经验
295 点
帖子
24
精华
0
在线时间
87 小时
注册时间
2015-11-10
最后登录
2019-9-10

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
各位大大好,我现在有一个全是浮点数的dataframe,我想保留每列最大的十个数值,其他的数值全部赋为0,有方法能办到么
二维码

扫码加我 拉你入群

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

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

关键词:Dataframe Frame Fram Data FRA 最大的

沙发
tsdxwwdz888 发表于 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") 代替

希望满足你的需要!
已有 1 人评分论坛币 收起 理由
admin_kefu + 30 热心帮助其他会员

总评分: 论坛币 + 30   查看全部评分

使用道具

藤椅
tsdxwwdz888 发表于 2016-7-2 02:36:38 |只看作者 |坛友微信交流群
我写了段代码po上来,咋没显示呢?

使用道具

板凳
tsdxwwdz888 发表于 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)导出 处理后的文件。

希望有所帮助!

使用道具

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

使用道具

地板
tsdxwwdz888 发表于 2016-7-5 23:08:25 |只看作者 |坛友微信交流群
patrick918 发表于 2016-7-5 14:54
谢谢,我找到了一个更简便的办法,就是用pd.rank得到每一列的排序序号,然后把序号大于10的全赋值0
好方法!我都不知道有rank这个函数

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 13:51