我有一个像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'