找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 315|回复: 8

[求助] 关于提升pandas执行效率的问题

1

主题

6

帖子

6

积分

贫民

积分
6
horizon2 发表于 2019-5-31 17:27:24 | 显示全部楼层 |阅读模式
我有以下的数据,导入到pandassame_freq_ho_pd里面了(有389行),想根据d_eci查找,修改d_mod3_value的值,修改后还有统计等功能。我先用下面的代码对d_eci的行生成一个列表。然后根据这个列表作为loc的依据进行赋值。#生成某个d_eci的所在行清单
d_eci_dic={}
def fuzhi_d_flage(d_cell,cell):
    if d_cell==cell:
        return True
    else:
        return False
for i in range(0,cell_num):
    eci = plan_site_pd.iloc[i, 2]
    d_eci_df=same_freq_ho_pd.apply(lambda x: fuzhi_d_flage(x.d_eci, eci), axis=1)
    d_eci_dic[eci]=d_eci_df

然后用下面对same_freq_ho_pd的赋值操作:
same_freq_ho_pd.loc[d_eci_dic[cell1],"d_mod3_value"] = cell1_mod3     

能够执行,但感觉速度比较慢,因为我这个赋值会要操作几万-几百万次,所以希望速度能够尽量加快,不知道各位高手有没有建议!
s_ecid_eciho_numpci_xpci_ys_mod3_value   \d_mod3_value
0
2168271
2132511
0
347
55
2
1
1
2168271
2132512
0
347
54
2
0
2
2168271
2133371
1757.167
347
21
2
0
3
2168271
2133372
187.3333
347
23
2
2
4
2168271
2158461
0
347
63
2
0
5
2168271
2158511
0
347
70
2
1
6
2168271
2158512
0
347
71
2
2
7
2168271
2168171
0
347
279
2
0
8
2168271
2168172
527.8333
347
280
2
1
9
2168271
2168272
4492.167
347
345
2
0
10
2168271
2170611
320
347
321
2
0
11
2168271
2170612
1748.167
347
322
2
1
12
2168271
2170613
1
347
323
2
2
13
2168271
2216893
0
347
336
2
0
14
2168271
2252181
49.33333
347
96
2
0
15
2168271
2252183
19.16667
347
98
2
2
16
2168271
2252381
34.33333
347
331
2
1
17
2168271
2252383
0
347
330
2
0
18
2168271
2252521
0
347
31
2
1
19
2168271
2252541
1373.5
347
318
2
0
20
2168271
2252542
73145.5
347
319
2
1
21
2168271
2257772
0
347
177
2
0
22
2168271
420781131
5946.833
347
189
2
0
23
2168271
420781132
137.5
347
190
2
1
24
2168271
420781133
0
347
188
2
2
25
2168272
2132511
14.5
345
55
0
1
26
2168272
2132512
465.6667
345
54
0
0
27
2168272
2133322
0
345
73
0
1





回复

使用道具 举报

0

主题

485

帖子

485

积分

骑士

积分
485
sheeboard 发表于 2019-5-31 19:53:13 | 显示全部楼层
能详细描述一下要求吗?比如“想根据d_eci查找”查什么?
回复 支持 反对

使用道具 举报

1

主题

6

帖子

6

积分

贫民

积分
6
horizon2  楼主| 发表于 2019-5-31 22:41:21 | 显示全部楼层
我的目的是上面表格里面,查找d_eci列为中某个值(cell3),将其对应的d_mod3_value列设置为特定的值( cell3_mod3)。
并且这个查找和和赋值的次数非常多,要反复进行,十几万到百万次。
主要是速度不够快,希望能够提升执行的效率。
我开始用apply来完成这个功能,但速度偏慢 。
same_freq_ho_pd["d_mod3_value"] = same_freq_ho_pd.apply(lambda x: fuzhi_mod3(x.d_eci, cell3, cell3_mod3), axis=1)
然后用先将d_eci列中给每个值简历一个列表,用这个列表来辅助定位,赋值,如下:
same_freq_ho_pd.loc[d_eci_dic[cell3], "d_mod3_value"] = cell3_mod3
速度是快了近3倍,但还是远达不到我的期望。
因为我用vba来写这个功能,速度都比这个快了至少6倍。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

6

积分

贫民

积分
6
horizon2  楼主| 发表于 2019-5-31 22:45:51 | 显示全部楼层
上面说的“然后用先将d_eci列中给每个值建立一个列表”里面就是对应这一行是否为这个值,如果是就是TRUE,否则为false。
将列表放到d_eci_dic字典里面。代码如下:
d_eci_dic={}
def fuzhi_d_flage(d_cell,cell):
    if d_cell==cell:
        return True
    else:
        return False
for i in range(0,cell_num):
    eci = plan_site_pd.iloc[i, 2]
    d_eci_df=same_freq_ho_pd.apply(lambda x: fuzhi_d_flage(x.d_eci, eci), axis=1)
    d_eci_dic[eci]=d_eci_df
回复 支持 反对

使用道具 举报

0

主题

485

帖子

485

积分

骑士

积分
485
sheeboard 发表于 2019-6-1 07:43:35 | 显示全部楼层
做表连接再操作快点。先看看10 Minutes to pandas了解一下基本操作,尽量用pandas自带的方法。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

6

积分

贫民

积分
6
horizon2  楼主| 发表于 2019-6-1 19:53:51 | 显示全部楼层
sheeboard 发表于 2019-6-1 07:43
做表连接再操作快点。先看看10 Minutes to pandas了解一下基本操作,尽量用pandas自带的方法。 ...

谢谢指导。
文档我看了,但是没有我需要的内容。
我的需求很简单:
比如找出表格中d_eci=2132511的所有行,将其对应的d_mod3_value列值改为1或其他值。
类似的操作我要操作十几万到几百万次。所以速度很重要,但是我发现执行的很慢,还没有VBA快。
回复 支持 反对

使用道具 举报

0

主题

485

帖子

485

积分

骑士

积分
485
sheeboard 发表于 2019-6-1 21:45:08 | 显示全部楼层
参考
Screenshot from 2019-06-01 21-41-07.png
回复

使用道具 举报

1

主题

6

帖子

6

积分

贫民

积分
6
horizon2  楼主| 发表于 2019-6-1 22:21:11 | 显示全部楼层

你的方法我试了,跟我现在的方法速度差不多。还是不够快呀!
有没有更快的方法呢?
回复 支持 反对

使用道具 举报

0

主题

485

帖子

485

积分

骑士

积分
485
sheeboard 发表于 2019-6-2 09:27:13 | 显示全部楼层
本帖最后由 sheeboard 于 2019-6-2 09:29 编辑

from pandas.util.testing import test_parallel

@test_parallel(num_threads=2)
def t2():
    df.loc[df['d_eci']==213251,'d_mod3_value']=100

t2()

试试并发运行呢。
Screenshot from 2019-06-02 09-28-59.png
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表