如何使用正则表达式将特定子字符串提取到新行中?

3

我有一个包含用户和客服代理之间完整聊天记录的数据框。 我想仅提取来自用户的消息,并使用相同的票据 ID 创建新行:

ticket_id = pd.DataFrame(["1","2"]).rename(columns={0:"Ticket-ID"})
full_chat = pd.DataFrame([
   "User foo foo foo 12:12 PM, Agent bar bar bar 12:12 PM, User foo foo 12:13 
    PM, Agent bar bar 12:13 PM, User foo 12:14 PM, Agent bar 12:14 PM", 

   "User bar bar bar 12:12 PM, Agent foo foo foo 12:12 PM, User bar bar 12:13 
    PM"
    ]).rename(columns={0:"Full-Chat"})


merge_chat = pd.merge(ticket_id, full_chat, left_index=True, right_index=True, how='outer')


def _split_row(text):
    cleaned_text = text.lower()

    lines = re.findall(r"\b\w*user\b\ (.*?)\ *\d\d:\d\d*", cleaned_text)        

    for line in lines:
        print(line.split())

print(merge_chat["Full-Chat"].apply(_split_row))

我希望它变得更像:

Ticket-ID      Full-Chat
1              foo foo foo
1              foo foo
1              foo
2              bar bar bar
2              bar bar
2个回答

1
我理解为,
merge_chat['Full-Chat'] = merge_chat['Full-Chat'].apply(lambda i: re.findall(r"\b\w*user\b\ (.*?)\ *\d\d:\d\d*", i.lower()))

从Pandas 0.25.0开始,

merge_chat.explode(column='Full-Chat')

我可以帮你进行翻译,以下是需要翻译的内容:

会给你结果

在0.25.0版本之前的版本中,

df = pd.DataFrame(merge_chat['Full-Chat'].tolist(), index=merge_chat['Ticket-ID']).stack()
df = df.reset_index([0, 'Ticket-ID'])
df.rename(columns={0:'Full-Chat'}, inplace=True)
df
  Ticket-ID Full-Chat
0   1   foo foo foo
1   1   foo foo
2   1   foo
3   2   bar bar bar
4   2   bar bar

0

我测试过了,它可以正常工作

ticket_id = pd.DataFrame(["1","2"]).rename(columns={0:"Ticket-ID"})
full_chat = pd.DataFrame(["User foo foo foo 12:12 PM, Agent bar bar bar 12:12 PM, User foo foo 12:13 PM, Agent bar bar 12:13 PM, User foo 12:14 PM, Agent bar 12:14 PM", "User bar bar bar 12:12 PM, Agent foo foo foo 12:12 PM, User bar bar 12:13 PM"]).rename(columns={0:"Full-Chat"})

merge_chat = pd.merge(ticket_id, full_chat, left_index=True, right_index=True, how='outer')

Output_df = pd.DataFrame(columns = ["Ticket-ID","Full-Chat"])

def split_row(text,ticket_id):
    cleaned_text = text.lower()
    lines = re.findall(r"\b\w*user\b\ (.*?)\ *\d\d:\d\d*", cleaned_text)
    return_df = pd.DataFrame(columns = ["Ticket-ID","Full-Chat"])
    for line in lines:
        New_row = pd.DataFrame({'Ticket-ID':[ticket_id],'Full-Chat':[line]})
        return_df = return_df.append(New_row)
    return return_df

for index, row in merge_chat.iterrows():
    Output_df = Output_df.append(split_row(row['Full-Chat'],row['Ticket-ID']))

Output_df=Output_df[['Ticket-ID', 'Full-Chat']].reset_index(drop=True)
Output_df.head()

输出:

 Ticket-ID Full-Chat
0 1 foo foo foo 
1 1 foo foo 
2 1 foo 
3 2 bar bar bar 
4 2 bar bar 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接