鱼C论坛

 找回密码
 立即注册
查看: 1317|回复: 2

[已解决]我的for循环跑得很慢,要如何优化?

[复制链接]
发表于 2022-3-9 17:17:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
跑得好慢呀

下面是代码:
  1. import pandas as pd
  2. import jieba

  3. login = pd.read_csv(r'login.csv', encoding = 'gbk')

  4. for i in range(login.shape[0]):  #login.shape[0]
  5.     if login.loc[i,'login_place'][0:2] == '中国':
  6.         login.loc[i,'国家'] = '中国'
  7.         if '黑龙江' in login.loc[i,'login_place']:
  8.             login.loc[i,'省份'] = '黑龙江'
  9.             if len(login.loc[i,'login_place']) > 5:
  10.                 login.loc[i,'地区'] = login.loc[i,'login_place'][5:]
  11.             else:pass
  12.         if '内蒙古' in login.loc[i,'login_place']:
  13.             login.loc[i,'省份'] = '内蒙古'
  14.             if len(login.loc[i,'login_place']) > 5:
  15.                 login.loc[i,'地区'] = login.loc[i,'login_place'][5:]
  16.             else:pass
  17.         if '新疆维吾尔' in login.loc[i,'login_place']:
  18.             login.loc[i,'省份'] = '新疆维吾尔'
  19.             if len(login.loc[i,'login_place']) > 7:
  20.                 login.loc[i,'地区'] = login.loc[i,'login_place'][7:]
  21.             else:pass
  22.         else:
  23.             login.loc[i,'省份'] = login.loc[i,'login_place'][2:4]
  24.             login.loc[i,'地区'] = login.loc[i,'login_place'][4:]
  25.     else:
  26.         li = [word for word in jieba.cut(login.loc[i,'login_place'])]
  27.         if len(li) == 2:
  28.             login.loc[i,'国家'] = li[0]
  29.             login.loc[i,'省份'] = li[1]
  30.         else:
  31.             login.loc[i,'国家'] = li[0]
复制代码
最佳答案
2022-3-9 18:32:03
不慢才怪呢!—— 逐行for遍历,还每次判断居然都login.loc[],相当于每次每行都进行"全表扫描"。 全表大概38万,你这样处理,最终至少造成 38万*38万*。。(看看你那么多个 if 和 login.loc[],都不觉得繁琐和奇怪吗)
其实,几十万行pandas完全可以处理过了,半秒钟都不用,也不用jieba来自动分词,就几种特殊情况完全可以自己手动分词。(省份要么三个字,如黑龙江,要么两个字)
解决:
  1. #%%
  2. import pandas as pd

  3. df = pd.read_csv('login.csv', encoding='gbk')
  4. display(df)

  5. df['country'] = df['login_place'].str[:2]
  6. def func_prov(row):
  7.     return row[2:5] if '黑龙江' in row or '内蒙古' in row else row[2:4]

  8. def func_city(row):
  9.     return row[5:] if '黑龙江' in row or '内蒙古' in row else row[4:]

  10. df['province'] = df['login_place'].apply(func_prov)
  11. df['city'] = df['login_place'].apply(func_city)

  12. df

  13. #%%
  14. # 测试
  15. df[df.province=='新疆']
  16. df[df.province=='黑龙江']
  17. df[df.province=='内蒙古']
  18. df[df.city=='乌鲁木齐']
  19. df[ df.city.str.contains('自治') ]
  20. df[ df.province.str.contains('新疆|黑龙江') ]
复制代码

login.rar

164.77 KB, 下载次数: 3

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-9 18:32:03 | 显示全部楼层    本楼为最佳答案   
不慢才怪呢!—— 逐行for遍历,还每次判断居然都login.loc[],相当于每次每行都进行"全表扫描"。 全表大概38万,你这样处理,最终至少造成 38万*38万*。。(看看你那么多个 if 和 login.loc[],都不觉得繁琐和奇怪吗)
其实,几十万行pandas完全可以处理过了,半秒钟都不用,也不用jieba来自动分词,就几种特殊情况完全可以自己手动分词。(省份要么三个字,如黑龙江,要么两个字)
解决:
  1. #%%
  2. import pandas as pd

  3. df = pd.read_csv('login.csv', encoding='gbk')
  4. display(df)

  5. df['country'] = df['login_place'].str[:2]
  6. def func_prov(row):
  7.     return row[2:5] if '黑龙江' in row or '内蒙古' in row else row[2:4]

  8. def func_city(row):
  9.     return row[5:] if '黑龙江' in row or '内蒙古' in row else row[4:]

  10. df['province'] = df['login_place'].apply(func_prov)
  11. df['city'] = df['login_place'].apply(func_city)

  12. df

  13. #%%
  14. # 测试
  15. df[df.province=='新疆']
  16. df[df.province=='黑龙江']
  17. df[df.province=='内蒙古']
  18. df[df.city=='乌鲁木齐']
  19. df[ df.city.str.contains('自治') ]
  20. df[ df.province.str.contains('新疆|黑龙江') ]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-10 08:18:55 | 显示全部楼层
阿奇_o 发表于 2022-3-9 18:32
不慢才怪呢!—— 逐行for遍历,还每次判断居然都login.loc[],相当于每次每行都进行"全表扫描"。 全表大概 ...

大哥说的是谢谢大哥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 02:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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