我有一个大的数据集~1GB,行数约为1400万。我想清理国名;也就是说,例如将CA
替换为CANADA
。
我试过了:
mttt_pings.replace(['^CA$', '^US$', '^UNITED STATES$', '^MX$', '^TR$', 'GB',
'^ENGLAND$', '^AU$', '^FR$', '^KOREA, REPUB OF$',
'^CONGO, DEM REP.$', '^SYRIA$', '^DOMINICAN REP.$',
'^RUSSIA$', '^TAIWAN$', '^UAE$', '^LIBYA$'],
['CANADA', 'UNITED STATES OF AMERICA',
'UNITED STATES OF AMERICA', 'MEXICO', 'TURKEY',
'UNITED KINGDOM', 'UNITED KINGDOM', 'AUSTRALIA', 'FRANCE',
'KOREA, REPUBLIC OF', 'CONGO', 'SYRIA ARAB REPUBLIC',
'DOMINICAN REPUBLIC', 'RUSSIA FEDERATION',
'TAIWAN, PROVINCE OF CHINA', 'UNITED ARAB EMIRATES',
'LIBYAN ARAB JAMAHIRIYA'],
regex = True, inplace = True)
这甚至不是完整的替换列表只是一个子集。在我退出这个过程之前,这持续了大约30分钟。
然后我尝试写个人replaces
,但那仍然太慢。
df.apply(function)
?示例集如下所示:
import time
import pandas as pd
t0 = time.time()
df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3],
'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd']})
df.replace({'^a$': 'America'}, regex = True, inplace = True)
df.replace({'^b$': 'Bahamas'}, regex = True, inplace = True)
df.replace({'^c$': 'Congo'}, regex = True, inplace = True)
df.replace({'^e$': 'Europe'}, regex = True, inplace = True)
df.replace({'^a$': 'Dominican Republic'}, regex = True, inplace = True)
tf = time.time()
total = tf - t0
显然这个集合太小,无法完全复制时间问题。
对于这种情况,四次运行会产生:tf = 0.00300002
,tf = 00299978
,tf = 0.00200009
和tf = 0.00300002
。
import time
import pandas as pd
t0 = time.time()
df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3],
'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd']})
df.replace(['^a$', '^b$', '^c$', '^d$', '^e$'],
['America', 'Bahamas', 'Congo', 'Dominican Republic', 'Europe'],
regex = True, inplace = True)
tf = time.time()
total = tf - t0
我们得到tf = 0.0019998
,tf = 0.00200009
,tf = 0.00200009
和tf = 0.00200009
所以看起来替换的列表版本更快但仍然在大型数据集上它真的很慢。有什么想法吗?
答案 0 :(得分:1)
对于DataFrame上存在的大多数方法,都有一个与列相同的Series等效方法。这似乎不在0.18的文档中(还是!)。
这对我有用:
df['CTRY_NM'].replace(to_replace=['^b','^c'], value=['America','Bahamas'], regex=True )
应该至少快一点吗?