如何提取df每行word_count最大值对应的review和review_id
解决方案
你的思路是对的,核心就是先定位每行word_count列最大值对应的索引,再用这个索引提取同位置的review和review_id即可,下面给两种可直接运行的实现:
方法1:逐行apply写法(逻辑直观,适合小数据量)
先构造测试数据方便复现:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'review': [['abc def', 'ghi'], ['jkl mno pqr', 'stu', 'vwx']], 'review_id': [[1, 2], [3, 4, 5]], 'word_count': [[2, 1], [3, 1, 1]] })
核心处理代码:
df[['review', 'review_id']] = df.apply( lambda row: pd.Series([ # 取word_count最大值对应位置的review row['review'][row['word_count'].index(max(row['word_count']))], # 取同位置的review_id row['review_id'][row['word_count'].index(max(row['word_count']))] ]), axis=1 )
运行后直接取df[['review', 'review_id']]就是你要的结果。
方法2:向量化写法(性能更高,适合大数据量)
apply逐行循环在数据量超过10万行的时候速度会明显变慢,用列表推导+argmax的方式性能会好很多:
import numpy as np # 批量获取每行word_count最大值的索引 max_pos = df['word_count'].apply(np.argmax) # 按索引批量提取对应值 df['review'] = [text_list[idx] for text_list, idx in zip(df['review'], max_pos)] df['review_id'] = [id_list[idx] for id_list, idx in zip(df['review_id'], max_pos)]
注意:如果某行的
word_count存在多个相等的最大值,上述两种方法默认都会取第一个出现最大值的对应内容,如果需要取最后一个/其他位置的最大值,调整索引取值逻辑即可。
两种方法最终输出效果完全一致:
| review | review_id |
|---|---|
| abc def | 1 |
| jkl mno pqr | 3 |
内容的提问来源于stack exchange,提问作者odebear
相关产品推荐
相关产品推荐

