我有一个 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
关于python - 在 Python Pandas 中格式化字符串数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49713998/