为Pandas DataFrame的sente列填充值并按该列分组处理
解决Pandas DataFrame填充缺失值与分组处理的方案
嘿,我来帮你搞定这个Pandas数据处理的需求!针对你给出的DataFrame,我们可以分两步完成操作:填充sente列的缺失值,再按sente分组并创建新列。
第一步:填充sente列的缺失值
你需要把sente列为空的行填充为上方最近的非空值,这在Pandas里用**向前填充(ffill)**就能轻松实现,代码如下:
import pandas as pd # 先构造你的原始DataFrame data = { 'id': [1,2,3,4,5,6,7,8,9,10,11,12,13], 'pos': ['a','b','b','a','d','cat','a','a','b','a','d','cat','cute'], 'value': ['I','have','a','cat','!','N','My','cat','is','cute','.','N','M'], 'sente': [21,21,21,21,21,None,22,22,22,22,22,None,None] } df = pd.DataFrame(data) # 用向前填充法填充sente列的缺失值 df['sente'] = df['sente'].ffill()
执行后,行6、12、13的sente值会分别被填充为21、22、22,完全符合你“取上方行sente值”的要求。
第二步:按sente分组并创建新列
接下来按sente分组,根据数据特征(看起来是分句的单词集合),这里给出两种常见的新列创建方案:
方式1:分组聚合生成精简新表
如果需要将每组内容聚合为一行(比如把每组的value拼接成完整分句),可以用agg方法:
# 按sente分组,拼接每组的value为句子,同时统计组内行数 grouped_df = df.groupby('sente').agg( complete_sentence=('value', ' '.join), # 拼接value成完整内容 total_rows=('id', 'count') # 可选:统计每组的总行数 ).reset_index()
生成的grouped_df结果如下:
| sente | complete_sentence | total_rows |
|---|---|---|
| 21 | I have a cat ! N | 6 |
| 22 | My cat is cute . N M | 7 |
方式2:在原表中添加分组关联列
如果需要保留原表所有行,同时让每行都显示所属组的聚合结果(比如每行都标注所在分句的完整内容),可以用transform方法:
# 在原DataFrame中添加新列,显示当前行所属sente组的完整拼接内容 df['complete_sentence'] = df.groupby('sente')['value'].transform(' '.join)
处理后的原表部分内容示例:
| id | pos | value | sente | complete_sentence |
|---|---|---|---|---|
| 1 | a | I | 21 | I have a cat ! N |
| 6 | cat | N | 21 | I have a cat ! N |
| 7 | a | My | 22 | My cat is cute . N M |
| 13 | cute | M | 22 | My cat is cute . N M |
自定义新列的其他思路
如果你的新列需求不是拼接内容,也可以灵活调整聚合逻辑:
- 统计每组行数:
df['group_size'] = df.groupby('sente')['id'].transform('count') - 取每组第一个
value:df['first_word'] = df.groupby('sente')['value'].transform('first') - 提取每组
value的唯一值:df['unique_values'] = df.groupby('sente')['value'].transform(lambda x: ', '.join(set(x)))
内容的提问来源于stack exchange,提问作者Mi.
相关产品推荐
相关产品推荐

