Python:在Pandas

时间:2016-03-30 13:56:30

标签: python pandas

我有一个大的数据集~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,但那仍然太慢。

  • 是否有更好(更有效)的方法来执行大量行上的pandas替换?
  • if语句的功能是否更明智然后使用 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.00300002tf = 00299978tf = 0.00200009tf = 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.0019998tf = 0.00200009tf = 0.00200009tf = 0.00200009

所以看起来替换的列表版本更快但仍然在大型数据集上它真的很慢。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

对于DataFrame上存在的大多数方法,都有一个与列相同的Series等效方法。这似乎不在0.18的文档中(还是!)。

这对我有用:

df['CTRY_NM'].replace(to_replace=['^b','^c'], value=['America','Bahamas'], regex=True )

应该至少快一点吗?