我有一个pandas DataFrame有3位数字(字符串),例如' 001' ,' 010'和' 121'。我想替换任何1位数字和任何2位数字符串,例如' 001'和' 010'只是' 1'和' 10'。
我该怎么做?我尝试使用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])
答案 0 :(得分:3)
或使用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
答案 1 :(得分:2)
您可以将系列转换为int
,然后转换为str
。
df_ZIPCOUNTY_CA['county code'] = df_ZIPCOUNTY_CA['county code'].astype(int).astype(str)
示例强>
df = pd.DataFrame({'A': ['001', '010', '100']})
df['A'] = df['A'].astype(int).map(str)
print(df)
# A
# 0 1
# 1 10
# 2 100
效果基准
df = pd.DataFrame({'A': ['001', '010', '100']})
df = pd.concat([df]*10000, ignore_index=True)
%timeit df['A'].astype(int).map(str) # 21.6 ms
%timeit df['A'].str.replace('^0+', '') # 77.2 ms
答案 2 :(得分:1)
使用to_numeric
pd.to_numeric(df.A)
Out[66]:
0 1
1 10
2 100
Name: A, dtype: int64
或者在python中使用lstrip
(不是pandas str.lstrip
)
[x.lstrip('0') for x in df.A]
计时:循环更快?? ...
%timeit [x.lstrip('0') for x in df.A]
100 loops, best of 3: 5.26 ms per loop
%timeit df['A'].str.lstrip('0')
100 loops, best of 3: 10 ms per loop