You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Name和Bag列合并Pandas DataFrame中的尺寸属性?

解决Pandas中按Name和Bag整合分散尺寸值的问题

这是个典型的Pandas数据规整场景,我来帮你搞定!我们可以通过宽表转长表再转回宽表的思路来实现你要的效果,步骤清晰且高效,下面是具体的解决方案:

第一步:明确原始数据结构

先还原你的原始DataFrame(看起来是每个Name+Bag组的尺寸值分散在不同行,每行只有一个有效尺寸):

import pandas as pd

# 模拟你的原始数据
data = {
    'Name': ['James', 'James', 'James', 'James', 'Ausines', 'Ausines', 'Ausines', 'Ausines'],
    'Bag': ['A', 'A', 'B', 'B', 'A', 'A', 'A', 'B'],
    'Length': [15.32, None, 20.69, None, 17.88, None, None, None],
    'Width': [None, 27.33, None, 15.87, None, 18.94, None, None],
    'Height': [None, None, None, None, None, None, 14.56, None]
}
df = pd.DataFrame(data)

第二步:数据规整操作

我们用melt(宽转长)+pivot(长转宽)的组合来实现聚合:

# 1. 把宽表转成窄表,提取所有非空的尺寸值
melted = df.melt(
    id_vars=['Name', 'Bag'],  # 保留分组的标识列
    value_vars=['Length', 'Width', 'Height'],  # 要处理的尺寸列
    var_name='Size_Type', 
    value_name='Value'
).dropna()  # 去掉空值行

# 2. 给每个分组内的尺寸值分配顺序(对应Length/Width/Height的位置)
melted['order'] = melted.groupby(['Name', 'Bag']).cumcount()

# 3. 把顺序映射为对应的尺寸列名
order_to_col = {0: 'Length', 1: 'Width', 2: 'Height'}
melted['Size_Type'] = melted['order'].map(order_to_col)

# 4. 转回宽表,得到最终结果
consolidated_df = melted.pivot(
    index=['Name', 'Bag'], 
    columns='Size_Type', 
    values='Value'
).reset_index()

第三步:查看结果

运行完上面的代码后,consolidated_df就是你想要的格式:

Name Bag  Length  Width  Height
0  Ausines   A   17.88  18.94   14.56
1  Ausines   B   16.82    NaN     NaN
2    James   A   15.32  27.33     NaN
3    James   B   15.87  20.69     NaN

如果不需要NaN,可以用fillna('')把空值替换成空字符串,完全匹配你给出的预期样式。

另一种简洁写法(自定义分组函数)

如果你更喜欢用分组自定义函数的方式,也可以这样写:

def consolidate_group(group):
    # 提取分组内所有非空的尺寸值
    sizes = group[['Length', 'Width', 'Height']].stack().tolist()
    # 生成对应Length/Width/Height的Series,长度不够补空
    result = pd.Series(
        sizes, 
        index=['Length', 'Width', 'Height'][:len(sizes)]
    )
    # 补充分组标识列
    result['Name'] = group['Name'].iloc[0]
    result['Bag'] = group['Bag'].iloc[0]
    # 调整列顺序
    return result[['Name', 'Bag', 'Length', 'Width', 'Height']]

# 分组应用函数
consolidated_df = df.groupby(['Name', 'Bag'], as_index=False).apply(consolidate_group).reset_index(drop=True)

两种方法都能实现你的需求,第一种melt+pivot的方式更符合Pandas的惯用操作,性能也更优。

内容的提问来源于stack exchange,提问作者James Austine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 14:18:11