将字符串的前 3 个字符与特定列匹配

Lyn*_*ynn 2 python numpy pandas

我有一个数据框 df,我想从特定列中获取字符串的前 3 个字符并将这些字符放在另一列下

数据

id  value   stat
aaa 10      aaa123
aaa 20  
aaa 500     aaa123
bbb 20  
bbb 10      bbb123
aaa 5       aaa123
            aaa123
            ccc123
Run Code Online (Sandbox Code Playgroud)

想要的

  id    value   stat
  aaa   10      aaa123
  aaa   20  
  aaa   500     aaa123
  bbb   20  
  bbb   10      bbb123
  aaa   5       aaa123
  aaa           aaa123
  ccc           ccc123
Run Code Online (Sandbox Code Playgroud)

正在做

 df.append({'aaa':aaa123}, ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

我相信我必须附加值,可能使用映射或附加函数,但是,不确定如何指定前 3 个字符。任何建议表示赞赏

Hen*_*ker 5

一种选择是Series.fillna+Series.str对前 3 个值进行切片:

df['id'] = df['id'].fillna(df['stat'].str[:3])
Run Code Online (Sandbox Code Playgroud)
    id  value    stat
0  aaa   10.0  aaa123
1  aaa   20.0     NaN
2  aaa  500.0  aaa123
3  bbb   20.0     NaN
4  bbb   10.0  bbb123
5  aaa    5.0  aaa123
6  aaa    NaN  aaa123
7  ccc    NaN  ccc123
Run Code Online (Sandbox Code Playgroud)

对于这种情况可能有点矫枉过正,但Series.str.extract也可以使用:

df['id'] = df['id'].fillna(df['stat'].str.extract(r'(^.{3})')[0])
Run Code Online (Sandbox Code Playgroud)

mask如果这些是空字符串而不是NaN

df['id'] = df['id'].mask(df['id'].eq('')).fillna(df['stat'].str[:3])
Run Code Online (Sandbox Code Playgroud)