拽猫的尾巴 发表于 2022-3-9 17:17:52

我的for循环跑得很慢,要如何优化?

跑得好慢呀{:10_285:}

下面是代码:
import pandas as pd
import jieba

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

for i in range(login.shape):#login.shape
    if login.loc == '中国':
      login.loc = '中国'
      if '黑龙江' in login.loc:
            login.loc = '黑龙江'
            if len(login.loc) > 5:
                login.loc = login.loc
            else:pass
      if '内蒙古' in login.loc:
            login.loc = '内蒙古'
            if len(login.loc) > 5:
                login.loc = login.loc
            else:pass
      if '新疆维吾尔' in login.loc:
            login.loc = '新疆维吾尔'
            if len(login.loc) > 7:
                login.loc = login.loc
            else:pass
      else:
            login.loc = login.loc
            login.loc = login.loc
    else:
      li = )]
      if len(li) == 2:
            login.loc = li
            login.loc = li
      else:
            login.loc = li

阿奇_o 发表于 2022-3-9 18:32:03

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

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

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

def func_city(row):
    return row if '黑龙江' in row or '内蒙古' in row else row

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

df

#%%
# 测试
df
df
df
df
df[ df.city.str.contains('自治') ]
df[ df.province.str.contains('新疆|黑龙江') ]

拽猫的尾巴 发表于 2022-3-10 08:18:55

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

大哥说的是{:10_262:}谢谢大哥
页: [1]
查看完整版本: 我的for循环跑得很慢,要如何优化?