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

标签 python python-3.x pandas dataframe

我有一个 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/

相关文章:

python - 将栅格单元格设置为零以在 Rasterio 中没有数据

python - 在 Python 中设置带约束的分区

python - 舍入 lambda 函数

python-3.x - 困惑于如何在程序中创建登录,并根据数据库中的引脚进行验证?

python - 如何根据另一列 B 的值替换 pandas 数据框列 A 的值

python - 将函数应用于 Pandas 行-行叉积

python - pyspark reduce 方法的歧义

Python:如何将用户输入中的文本与文本文件或mysql数据库中的内容进行比较?

python-3.x - 维度不匹配 : array 'cov' is of shape (1, 1),但 'mean' 是长度为 2 的向量

python - 在多索引数据帧上使用 groupby/apply 时索引级别加倍