过滤Pandas数据帧行并替换列中的值

SLg*_*der 0 python replace pandas

我得到了各种格式的电话号码清单:

df = pd.DataFrame(
    {'phone': ['0123/12345', '0123-23456', '0123/4455-10', '0123-4455-22'],
     'name': ['A-1', 'B-1', 'C/3', 'D/7']})

  name phone
0 A-1  0123/12345
1 B-1  0123-23456
2 C/3  0123/4455-10
3 D/7  0123-4455-22
Run Code Online (Sandbox Code Playgroud)

我想要的格式是#0和#2行.

当我专注于#1时,我尝试了以下方法:

df.loc[(df.phone.str.count('-')==1) &
       (df.phone.str.count('/')==0)].apply(lambda x: x.str.replace('-', '/'))
Run Code Online (Sandbox Code Playgroud)

这就是数字的诀窍,但不幸的是在名称列上:

  name phone
1 B/1  0123/23456 
Run Code Online (Sandbox Code Playgroud)

但是不能更改名称列.

所以我有两个问题:

  1. 如何过滤行并仅更改电话列?
  2. 我怎样才能使用#3,在那里我想将第一次出现的' - '替换为'/'?

Psi*_*dom 7

您只能在列电话上使用正则表达式替换(str.replace方法):

df['phone'] = df.phone.str.replace("^(\d+)-(.*)$", r"\1/\2")
df
#  name        phone
#0  A-1   0123/12345
#1  B-1   0123/23456
#2  C/3 0123/4455-10
#3  D/7 0123/4455-22
Run Code Online (Sandbox Code Playgroud)

关于正则表达式的解释:

^(\d+)-(.*)$匹配以数字开头并紧跟破折号的字符串,这是第0行和第2行的情况; 使用后向引用,它将第一个短划线替换为第/1行和第3行,因为它们与正则表达式不匹配,不会应用任何修改.