如何将列表中多语句存入pandas DataFrame及解决评论拆分合并异常
嘿,我来帮你搞定这个问题!
首先得搞清楚你遇到的19列问题到底咋回事:我猜你之前可能是直接把拆分出来的句子列表直接赋值给DataFrame的新列了,结果pandas把每个句子当成了单独的列,才会冒出这么多列——这是因为pandas对列表的赋值逻辑和你预期的不一样,它会把二维列表(每行拆出的句子组成的大列表)的每个子元素当成一列,而不是把每个子列表放进单个单元格里。
下面分两种常见需求给你解决方案:
需求1:原表每行保留,新增一列存该评论的拆分句子列表
这种情况适合你需要保留原评论的整体信息,同时在一列里存拆分后的句子集合。
步骤如下:
- 先导入需要的库并下载nltk的分词模型:
import pandas as pd from nltk.tokenize import sent_tokenize import nltk nltk.download('punkt')
- 写一个处理单条评论的拆分函数,顺便处理空值避免报错:
def split_into_sentences(text): # 处理空评论的情况 if pd.isna(text): return [] # 用nltk拆分句子 return sent_tokenize(text)
- 给原DataFrame新增列,用
apply对每行的评论字段调用拆分函数:
# 假设你的原表叫df,评论字段是'review' df['split_sentences'] = df['review'].apply(split_into_sentences)
这样每个单元格里就会是一个包含该评论所有拆分句子的列表,不会生成多余的列。
需求2:把每个拆分后的句子单独成一行,关联原表的其他字段
这种情况更适合后续的单句分析,比如统计每个句子的情感、关键词等,每行对应一个句子,原表的其他字段(比如评论ID、用户ID)会跟着重复。
在需求1的基础上,用pandas的explode方法就能轻松实现:
# 把列表列展开成单独的行,ignore_index=True重置索引 df_expanded = df.explode('split_sentences', ignore_index=True)
举个例子,原表一行评论拆出3个句子,用explode后就会变成3行,每行对应一个句子,其他字段和原行保持一致。
举个完整的示例
假设你的原数据是这样的:
data = { 'review_id': [1, 2], 'user_id': [1001, 1002], 'review': [ "这款耳机音质很棒,续航也够久。就是价格有点小贵,不过值得入手。", "物流太慢了,等了五天才到。包装倒是很严实,没有损坏。" ] } df = pd.DataFrame(data)
按照上面的步骤处理后,df的split_sentences列会是:
| review_id | user_id | review | split_sentences |
|---|---|---|---|
| 1 | 1001 | 这款耳机音质很棒,续航也够久。就是价格有点小贵,不过值得入手。 | ["这款耳机音质很棒,续航也够久。", "就是价格有点小贵,不过值得入手。"] |
| 2 | 1002 | 物流太慢了,等了五天才到。包装倒是很严实,没有损坏。 | ["物流太慢了,等了五天才到。", "包装倒是很严实,没有损坏。"] |
而df_expanded会变成:
| review_id | user_id | split_sentences |
|---|---|---|
| 1 | 1001 | 这款耳机音质很棒,续航也够久。 |
| 1 | 1001 | 就是价格有点小贵,不过值得入手。 |
| 2 | 1002 | 物流太慢了,等了五天才到。 |
| 2 | 1002 | 包装倒是很严实,没有损坏。 |
这样就完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Nika
相关产品推荐
相关产品推荐

