以下代码会删除任何电话号码列中的所有短划线。如果电话号码以1开头,我如何删除这些列中电话号码的第一个字符。我基本上希望所有十位数字都没有前导1。
import pandas as pd
import numpy as np
import re
df = pd.read_csv('test2.csv')
cols_to_check = ['Phone', 'phone', 'Phone.1']
df[cols_to_check] = df[cols_to_check].replace({'-':''}, regex=True)
df.to_csv('testnew.csv', mode = 'w', index=False)
答案 0 :(得分:3)
我会使用applymap
选项1
使用str.replace
只需将'-'
替换为''
。我假设我们总能拿到最后10位数。
df[cols_to_check].applymap(lambda x: x.replace('-', '')[-10:])
Phone phone Phone1
0 1234567890 1234567890 1234567890
1 1234567890 1234567890 1234567890
2 1234567890 1234567890 1234567890
选项2
使用re.sub
但是,如果要删除所有非数字字符,请使用正则表达式模块re
并执行类似于选项1中的操作
import re
df[cols_to_check].applymap(lambda x: re.sub(r'\D', '', x)[-10:])
Phone phone Phone1
0 1234567890 1234567890 1234567890
1 1234567890 1234567890 1234567890
2 1234567890 1234567890 1234567890
选项3
我们也可以使用pd.Series.str
字符串访问器。但是,我们需要首先崩溃成一系列。
df[cols_to_check].stack().str.replace('\D', '').str[-10:].unstack()
Phone phone Phone1
0 1234567890 1234567890 1234567890
1 1234567890 1234567890 1234567890
2 1234567890 1234567890 1234567890
设置
df = pd.DataFrame(dict(
Phone=['1-123-456-7890', '123-4567890', '11234567890'],
phone=['1-123-456-7890', '123-4567890', '11234567890'],
Phone1=['1-123-456-7890', '123-4567890', '11234567890'],
Other=[1, 2, 3]
))
cols_to_check = ['Phone', 'phone', 'Phone1']
df
Other Phone Phone1 phone
0 1 1-123-456-7890 1-123-456-7890 1-123-456-7890
1 2 123-4567890 123-4567890 123-4567890
2 3 11234567890 11234567890 11234567890
答案 1 :(得分:2)
这是使用apply
工具将具有非平凡逻辑的函数应用于列的示例:
for col in cols_to_check:
df[col] = df[col].apply(lambda x : x[1:] if x.startswith("1") else x)