Skip to main content
 首页 » 编程设计

python之在 Python Pandas 中格式化字符串数字

2025年05月04日16langtianya

我有一个 pandas DataFrame,它有 3 个数字(字符串),例如 '001'、'010' 和 '121'。我想用 '1' 和 '10' 替换任何 1 位数字和任何 2 位数字字符串,例如 '001' 和 '010'。

我该怎么做?我尝试使用 apply 方法(见下文)但没有任何变化。

df.ZIPCOUNTY_CA 是 pandas 数据框,'county code' 是包含这些字符串数字的列。

df_ZIPCOUNTY_CA[df_ZIPCOUNTY_CA['county code'].str.startswith('0')]['county codes'] = df_ZIPCOUNTY_CA[df_ZIPCOUNTY_CA['county code'].str.startswith('0')]['county code'].apply(lambda x: x.split('0')[1]) 

请您参考如下方法:

或者使用str.replace 删除前导零:

df_ZIPCOUNTY_CA['county code'] 
 
#0    010 
#1    001 
#2    121 
#Name: county code, dtype: object 
 
df_ZIPCOUNTY_CA['county code'].str.replace('^0+', '') 
 
#0     10 
#1      1 
#2    121 
#Name: county code, dtype: object 

^0+ 是一个正则表达式; ^匹配字符串开头,0匹配字面量0,+是量词代表一个或多个; ^0+ 一起匹配从字符串开头开始的所有零。

这里是关于这两种方法的一些时间安排。

df_ZIPCOUNTY_CA = pd.DataFrame([['010'], ['001'], ['121']], columns=['county code']) 
​ 
df_ZIPCOUNTY_CA = pd.concat([df_ZIPCOUNTY_CA] * 10000) 
 
%timeit df_ZIPCOUNTY_CA['county code'].str.replace('^0+', '') 
# 10 loops, best of 3: 37.1 ms per loop 
 
%timeit df_ZIPCOUNTY_CA['county code'].astype(int).astype(str) 
# 10 loops, best of 3: 70.8 ms per loop 

或者正如@Bill 评论的那样,可能只使用str.lstrip,这里是最快的方法:

%timeit df_ZIPCOUNTY_CA['county code'].str.lstrip('0') 
# 100 loops, best of 3: 8.9 ms per loop 
 
# added the map str approach for comparison as well 
%timeit df_ZIPCOUNTY_CA['county code'].astype(int).map(str) 
# 100 loops, best of 3: 13.3 ms per loop