在python中以下划线分割并存储第一个值

Ssa*_*ank 11 python pandas

我有一个像df一样的pandas数据框,带有一个列construct_name

construct_name
aaaa_t1_2    
cccc_t4_10
bbbb_g3_3
Run Code Online (Sandbox Code Playgroud)

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

预期产出

construct_name  name
aaaa_t1_2       aaaa
cccc_t4_10      bbbb
Run Code Online (Sandbox Code Playgroud)

等等.

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

[aaaa,t1,2]
[cccc,t4,10]
Run Code Online (Sandbox Code Playgroud)

等等

但是,当我这样做

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

EdC*_*ica 30

只需使用矢量化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
Run Code Online (Sandbox Code Playgroud)

  • `.str[0]` 很重要。我想知道 `df['construct_name'].str.split('_')[0]` 有什么问题 (5认同)

rod*_*ece 11

使用矢量化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
Run Code Online (Sandbox Code Playgroud)

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

就标志的一般行为而言expand=True,请注意,如果输入字符串没有相同数量的下划线,您将无法得到Nones:

>>> 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
Run Code Online (Sandbox Code Playgroud)


gil*_*ero 7

df['name'] = df['construct_name'].str.split('_').str.get(0)
Run Code Online (Sandbox Code Playgroud)

或者

df['name'] = df['construct_name'].str.split('_').apply(lambda x: x[0])
Run Code Online (Sandbox Code Playgroud)