我有一个 pandas 数据框,其中包含两个人(客户和服务台运算符(operator))之间的网络聊天实例。
当客户进入对话时,客户姓名始终会在网络聊天的第一行中公布。
示例 1:
在:df['log'][0]
输出:[14:40:48] 您正在加入与 James 的聊天[14:40:48] James:您好,我想了解有关您提供的服务和产品的更多信息。 [14:41:05] Greg:感谢您联系我们。 [17:41:14] 格雷格:首先我可以问一下您有兴趣了解哪些服务系列或产品吗?[14:41:23] 詹姆斯:我想了解更多有关您的园艺和排水沟服务的信息.[14:43:20] 詹姆斯:你好?[14:43:32] 格雷格:谢谢,有关这些的更多信息,请访问 www.example.com/more_examples。[14:44:12] 詹姆斯:谢谢[ 14:44:38] James 已退出 session 。
示例 2:
在:df['log'][1]
输出:[09:01:25] 您正在加入与 Roy Andrews 的聊天[09:01:25] Roy Andrews:我代表合作伙伴询问她是否仍然能够要求保修在她一年半前购买的咖啡机上? [09:02:00] Jamie:感谢您联系我们。我可以先询问一下购买的咖啡机类型,以及她是否还有收据吗?[09:02:23] Roy Andrews:BRX0403,她不再有收据。[09:05:30] Jamie:谢谢,我的解释是她无法 claim ,因为她不再处于保修期内。 [09:08:46] Jamie:有关我们产品保修政策的更多信息,请参阅 www.brandx.com/warranty-policy/information[09:09:13] Roy Andrews:感谢您的链接,我会让她知道.[09:09:15] Roy Andrews 已退出 session 。
随着不同的客户使用网络聊天服务,聊天中的名称总是会有所不同。
客户可以使用一个或多个名称进入聊天室。例子:
詹姆斯
拉维
罗伊·安德鲁斯
。
要求:
我想将客户聊天的所有实例(例如 James
和 Roy Andrews
的聊天)与 df['log']
列插入新列df[text_analysis]
。
从上面的示例 1 来看,这看起来像:
在:df['text_analysis][0]
输出:[14:40:48] 您正在加入与 James 的聊天[14:40:48] James:您好,我想了解有关您提供的服务和产品的更多信息。 [14:41:23] 詹姆斯:我想了解更多关于你们的园艺和排水沟服务的信息。[14:43:20] 詹姆斯:你好?[14:44:12] 詹姆斯:谢谢
编辑:
最佳解决方案是提取上例中提供的子字符串并省略最终时间戳[14:44:38] James已退出 session 。
。
到目前为止我已经尝试过:
我已使用以下方法将 df['log']
列中的客户名称提取到名为 df['names']
的新列中:
df['names'] = df['log'].apply(lambda x: x.split(' ')[7].split('[')[0])
我想使用 df['names']
列中的名称在 str.split()
pandas 函数中使用 - 类似于:
df['log'].str.split(df['names'])
但是这不起作用,如果在这种情况下确实发生了拆分,我认为它不会正确拆分客户和服务运算符(operator)分开聊天。
我还尝试将名称合并到正则表达式类型解决方案中:
df['log'].str.extract('([^.]*{}[^.]*)').format(df['log']))
但这也不起作用(因为我猜测 .extract()
不支持格式。
如有任何帮助,我们将不胜感激。
最佳答案
使用regex
,longs
是你的第一段:
import re
re.match(r'^.*(?=\[)', longs).group()
结果:
“[14:40:48] 您正在加入与 James 的聊天[14:40:48] James:您好,我想了解有关您提供的服务和产品的更多信息。[14 :41:05] Greg: 感谢您联系我们。[17:41:14] Greg: 我可以首先询问一下您有兴趣了解哪些服务系列或产品吗?[14:41:23] James :我想了解更多关于你们的园艺和排水沟服务的信息。[14:43:20] James:你好?[14:43:32] Greg:谢谢,有关这些的更多信息,请访问 www.example.com/more_examples.[14:44:12] 詹姆斯:谢谢”
您可以将此正则表达式函数打包到数据框中:
df['text_analysis'] = df['log'].apply(lambda x: re.match(r'^.*(?=\[)', x).group())
说明:正则字符串'^.*(?=\[)'
表示:从^
开始,匹配任意数量的任意字符.*
,以 [
结尾,但不包含 (?=\[)
。由于正则表达式匹配最长的字符串,因此将从开头一直到最后一个 [
,并且不包括 [
。
可以通过这种方式提取单独的行:
import re
customerspeak = re.findall(r'(?<=\[(?:\d{2}:){2}\d{2}\]) James:[^\[]*', s)
输出:
[" James: Hello, I'm looking to find out more about the services and products you offer.",
' James: I would like to know more about your gardening and guttering service.',
' James: hello?',
' James: Thanks']
如果您希望它们在同一行中,您可以''.join(customerspeak)
关于python - 正则表达式和 Pandas : extract partial string on name match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53075382/