我的数据框包含所有列中的关键字和值。请参阅下面的示例。
我想将regex应用于所有列。所以我使用for循环并应用正则表达式:
for i in range (1,maxExtended_Keywords):
temp = 'extdkey_' + str(i)
Extended_Keywords[temp] = Extended_Keywords[temp].str.extract(":(.*)",expand=True)
我得到了理想的最终结果。没问题。
然而,只有古玩是有一种pythonic方式将正则表达式应用于整个数据帧而不是使用for循环并应用于列。
谢谢,
答案 0 :(得分:4)
将pandas.DataFrame.replace
与regex=True
df.replace('^.*:\s*(.*)', r'\1', regex=True)
请注意,我的模式使用括号来捕获':'
之后的部分,并使用原始字符串r'\1'
来引用该捕获组。
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。