2017-08-28 25 views
2

以下代碼將刪除任何電話號碼列中的任何破折號。如果電話號碼以1開頭,我還需要在這些列中刪除電話號碼的第一個字符。我基本上都希望所有的十位數字都沒有前導1。如果數字爲1,則從pandas列中刪除第一個字符

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

這是使用apply設施施加與非平凡的邏輯功能,以一列的一個示例:

for col in cols_to_check: 
    df[col] = df[col].apply(lambda x : x[1:] if x.startswith("1") else x) 

this overview of apply見。

2

我會使用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 
相關問題