格式化Python Pandas中的字符串数字

时间:2018-04-08 03:05:45

标签: python python-3.x pandas dataframe

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

3 个答案:

答案 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