将正则表达式应用于数据帧

时间:2018-04-13 19:05:03

标签: python regex pandas

我的数据框包含所有列中的关键字和值。请参阅下面的示例。

Input DataFrame

我想将regex应用于所有列。所以我使用for循环并应用正则表达式:

for i in range (1,maxExtended_Keywords):
    temp = 'extdkey_' + str(i)
    Extended_Keywords[temp] = Extended_Keywords[temp].str.extract(":(.*)",expand=True)

我得到了理想的最终结果。没问题。

Desired output

然而,只有古玩是有一种pythonic方式将正则表达式应用于整个数据帧而不是使用for循环并应用于列。

谢谢,

2 个答案:

答案 0 :(得分:4)

pandas.DataFrame.replaceregex=True

一起使用
df.replace('^.*:\s*(.*)', r'\1', regex=True)

请注意,我的模式使用括号来捕获':'之后的部分,并使用原始字符串r'\1'来引用该捕获组。

MCVE

df = pd.DataFrame([
    [np.nan, 'thing1: hello'],
    ['thing2: world', np.nan]
], columns=['extdkey1', 'extdkey2'])

df

        extdkey1       extdkey2
0            NaN  thing1: hello
1  thing2: world            NaN
df.replace('^.*:\s*(.*)', r'\1', regex=True)

  extdkey1 extdkey2
0      NaN    hello
1    world      NaN

答案 1 :(得分:0)

你可以使用applymap,它会为数据框中的每个元素应用一些函数,对于这个问题,你可以这样做:

func = lambda x: re.findall('^.*:\s*(.*)', x)[0] if re.findall('^.*:\s*(.*)', str(x)) else x
df.applymap(func)

警告:由于效率问题,请避免对大型数据帧使用applymap。