如何用Python基于Excel现有列创建聚合风味的新列?
实现步骤与代码
步骤说明
- 标记原Food列空值位置:先记录原始表格中Food列的空值行,方便后续还原格式。
- 填充Food列空值:用向前填充(
ffill())把同一食物组的空值行补全为对应食物名称,确保分组聚合的准确性。 - 分组聚合风味字符串:按Food列分组,将每组的Flavor值用空格拼接成完整的风味组合。
- 匹配聚合结果并清理空行:把聚合后的风味字符串合并回原数据,仅保留每个食物组第一行的结果,其余行设为空。
- 还原原Food列格式:将之前填充的Food列空值恢复为原始状态。
完整代码
import pandas as pd # 读取Excel文件(用户已有代码) df = pd.read_excel(r'Path where the Excel file is stored\File name.xlsx') # 1. 记录原始Food列的空值位置 original_empty_food = df['Food'].isna() # 2. 向前填充Food列空值,统一同一组的Food标识 df['Food'] = df['Food'].ffill() # 3. 按Food分组,聚合Flavor为空格分隔的字符串 flavor_agg = df.groupby('Food')['Flavor'].agg(' '.join).reset_index(name='Flavors') # 4. 合并聚合结果到原DataFrame df = df.merge(flavor_agg, on='Food', how='left') # 5. 仅保留每个Food组第一行的Flavors值,其余行设为空 df['Flavors'] = df.groupby('Food')['Flavors'].transform(lambda x: x.where(x.index == x.first_valid_index(), '')) # 6. 恢复原Food列的空值状态 df.loc[original_empty_food, 'Food'] = pd.NA # 查看最终结果(可选) print(df)
代码细节解释
original_empty_food:存储原始表格中Food列的空值行索引,避免填充后无法还原原始格式。df['Food'].ffill():将同一食物组的后续空值行补全为组内首个非空的Food名称,比如Apple组的后两行Food会被填充为Apple,保证分组逻辑正确。groupby('Food')['Flavor'].agg(' '.join):对每个Food组的Flavor列进行字符串拼接,生成该食物的完整风味组合。transform(lambda x: x.where(...)):针对每个Food分组,仅保留组内第一行的Flavors值,其余行替换为空字符串,符合用户需求的显示格式。df.loc[original_empty_food, 'Food'] = pd.NA:将Food列恢复为原始的空值状态,与用户提供的示例表格格式完全匹配。
最终效果
执行代码后得到的表格如下,与用户示例一致:
| Food | Flavor | Flavors |
|---|---|---|
| Apple | Cranberry | Cranberry Peach Lemon |
| Peach | ||
| Lemon | ||
| Banana | Chocolate | Chocolate Peanut Vanilla |
| Peanut | ||
| Vanilla |
内容的提问来源于stack exchange,提问作者Sirod123
相关产品推荐
相关产品推荐

