猿问

根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列

所以我有大约 40,000 行人员和他们的投诉。我正在尝试将它们分类到各自的列中进行分析,并且我公司中使用其他工具的其他分析师可以使用这些数据。


数据框示例:


df = pd.DataFrame({"person": [1, 2, 3], 

                   "problems": ["body: knee hurts(bad-pain), toes hurt(BIG/MIDDLE); mind: stressed, tired", 

                                "soul: missing; mind: can't think; body: feels great(lifts weights), overweight(always bulking), missing a finger", 

                                "none"]})

df     

╔═══╦════════╦══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗

║   ║ person ║                                                     problems                                                     ║

╠═══╬════════╬══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣

║ 0 ║      1 ║ body: knee hurts(bad-pain), toes hurt(BIG/MIDDLE); mind: stressed, tired                                         ║

║ 1 ║      2 ║ soul: missing; mind: can't think; body: feels great(lifts weights), overweight(always bulking), missing a finger ║

║ 2 ║      3 ║ none                                                                                                             ║

╚═══╩════════╩══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝


我尝试过的事情/我在哪里:


所以我至少能够用一个似乎可以用我的真实数据完成这项工作的正则表达式语句将它们分开。


df.problems.str.extractall(r"(\b(?!(?: \b))[\w\s.()',:/-]+)")


我是一个正则表达式初学者,所以我希望这可能会做得更好。我原来的正则表达式模式是r'([^;]+)',但我试图排除分号后的空格。


所以我很茫然。我玩过:


df.problems.str.extractall(r"(\b(?!(?: \b))[\w\s.()',:/-]+)").unstack(),在我的示例中“有效”(不会出错)。


但是使用我的真实数据,我得到一个错误:"ValueError: Index contains duplicate entries, cannot reshape"


即使它适用于我的真实数据,我仍然必须弄清楚如何将这些“类别”(身体、思想、灵魂)放入指定的列中。


如果我能更好地表达这个问题,我可能会有更好的运气。我正在尝试在这里真正自学,所以即使它们不是完整的解决方案,我也会很感激任何线索。


我正在寻找一条线索,也许我可以通过 groupby 或 multiIndex 技术以某种方式做到这一点。对编程有点陌生,所以我仍然在黑暗中摸索。我将不胜感激任何人提供的任何提示或想法。谢谢!


富国沪深
浏览 89回答 1
1回答

aluckdog

它并不优雅,但它完成了工作:df['split'] = df.problems.str.split(';')df['mind'] = df.split.apply(    lambda x: ''.join([category for category in x if 'mind' in category]))df['body'] = df.split.apply(    lambda x: ''.join([category for category in x if 'body' in category]))df['soul'] = df.split.apply(    lambda x: ''.join([category for category in x if 'soul' in category]))df.drop('split', inplace=True)你可能会换行df[cat] = df.split.apply(lambda x: ''.join([category for category in x if cat in category])) 在一个函数中并在每个数据帧上运行它cat(例如cats=['mind', 'body', 'soul', 'whathaveyou', 'etc.'].编辑:正如@ifly6 所指出的,用户输入的字符串中可能存在关键字交叉。为了安全起见,该功能应更改为df[cat] = df.split.apply(lambda x: ''.join([category for category in x if category.startswith(cat)])) 
随时随地看视频慕课网APP

相关分类

Python
我要回答