Pandas DataFrame从列获取子字符串

时间:2015-07-31 09:18:03

标签: python pandas dataframe

我有一个名为“KL”的列,例如:

sem_0405M4209F2057_1.000
sem_A_0103M5836F4798_1.000

现在我要提取“M”后的四位数和“F”后的四位数。但是df["KL"].str.extract我无法让它发挥作用。

M和F的位置不同,因此仅使用切片[9:13]将不适用于整个列。

3 个答案:

答案 0 :(得分:1)

如果您想使用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也做了同样的事情。

答案 1 :(得分:0)

您可以使用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

答案 2 :(得分:0)

您也可以使用正则表达式:

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)