【发布时间】:2015-07-31 09:18:02
【问题描述】:
我有一个名为“KL”的列,例如:
sem_0405M4209F2057_1.000
sem_A_0103M5836F4798_1.000
现在我想提取“M”之后的四位数字和“F”之后的四位数字。但是df["KL"].str.extract 我无法让它工作。
M 和 F 的位置不同,因此仅使用切片 [9:13] 将不适用于整个列。
【问题讨论】:
我有一个名为“KL”的列,例如:
sem_0405M4209F2057_1.000
sem_A_0103M5836F4798_1.000
现在我想提取“M”之后的四位数字和“F”之后的四位数字。但是df["KL"].str.extract 我无法让它工作。
M 和 F 的位置不同,因此仅使用切片 [9:13] 将不适用于整个列。
【问题讨论】:
如果你想使用str.extract,方法如下:
>>> df['KL'].str.extract(r'M(?P<M>[0-9]{4})F(?P<F>[0-9]{4})')
M F
0 4209 2057
1 5836 4798
这里,M(?P<M>[0-9]{4}) 匹配字符 'M',然后捕获它后面的 4 位数字([0-9]{4} 部分)。这放在M 列中(在捕获组内用?P<M> 指定)。 F 也是如此。
【讨论】:
您可以使用split 来实现这一点,可能存在更好的方法:
In [147]:
s = pd.Series(['sem_0405M4209F2057_1.000','sem_A_0103M5836F4798_1.000'])
s
Out[147]:
0 sem_0405M4209F2057_1.000
1 sem_A_0103M5836F4798_1.000
dtype: object
In [153]:
m = s.str.split('M').str[1].str.split('F').str[0][:4]
f = s.str.split('M').str[1].str.split('F').str[1].str[:4]
print(m)
print(f)
0 4209
1 5836
dtype: object
0 2057
1 4798
dtype: object
【讨论】:
你也可以使用正则表达式:
import re
def get_data(x):
data = re.search( r'M(\d{4})F(\d{4})', x)
if data:
m = data.group(1)
f = data.group(2)
return m, f
df = pd.DataFrame(data={'a': ['sem_0405M4209F2057_1.000', 'sem_0405M4239F2027_1.000']})
df['data'] = df['a'].apply(lambda x: get_data(x))
>>
a data
0 sem_0405M4209F2057_1.000 (4209, 2057)
1 sem_0405M4239F2027_1.000 (4239, 2027)
【讨论】: