在 Python 中拆分下划线并存储第一个值



我有一个像df这样的熊猫数据框,带有列construct_name

construct_name
aaaa_t1_2    
cccc_t4_10
bbbb_g3_3

等等。我想首先拆分下划线处的所有名称,并将第一个元素(aaaa、cccc 等)存储为另一个列名。

预期产出

construct_name  name
aaaa_t1_2       aaaa
cccc_t4_10      bbbb

等等。

我尝试了以下方法 df['construct_name'].map(lambda row:row.split("_")),它给了我一个列表,比如

[aaaa,t1,2]
[cccc,t4,10]

等等

但是当我这样做时

df['construct_name'].map(lambda row:row.split("_"))[0]获取列表的第一个元素,我收到错误。你能建议一个修复吗?谢谢

只需使用矢量化str方法split并在列表中使用整数索引即可获取第一个元素:

In [228]:
df['first'] = df['construct_name'].str.split('_').str[0]
df
Out[228]:
  construct_name first
0      aaaa_t1_2  aaaa
1     cccc_t4_10  cccc
2      bbbb_g3_3  bbbb

使用矢量化str.split方法的另一种方法是传递 expand=True 标志,然后为每个拆分部分返回一列。

>>> s = pd.Series( ['aaaa_t1_2', 'cccc_t4_10', 'bbbb_g3_3'], name='construct_name')
>>> s.str.split('_', expand=True)  # to see what expand=True does
      0   1   2
0  aaaa  t1   2
1  cccc  t4  10
2  bbbb  g3   3
>>>  s.str.split('_', expand=True)[0]  # what you want, select first elements
0    aaaa
1    cccc
2    bbbb

例如,如果您想保留第一个和第二个值,这将特别有用。

expand=True 标志的一般行为而言,请注意,如果输入字符串没有相同数量的下划线,则 ca 得到None s:

>>> s = pd.Series( ['aaaa_t1_2', 'cccc_t4', 'bbbb_g33'], name='construct_name')
>>> s.str.split('_', expand=True)
      0    1     2
0  aaaa   t1     2
1  cccc   t4  None
2  bbbb  g33  None
df['name'] = df['construct_name'].str.split('_').str.get(0)

df['name'] = df['construct_name'].str.split('_').apply(lambda x: x[0])

执行完split后,您应该得到第一个元素(使用 [0])。而不是在map之后.

In [608]: temp['name'] = temp['construct_name'].map(lambda v: v.split('_')[0])
In [609]: temp
Out[609]: 
  construct_name  name
0      aaaa_t1_2  aaaa
1     cccc_t4_10  cccc
2      bbbb_g3_3  bbbb

split取一个可选参数maxsplit

>>> construct_name = 'aaaa_t1_2'
>>> name, rest = construct_name.split('_', 1)
>>> name
'aaaa'

相关内容

最新更新