如何基于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
相关产品推荐
相关产品推荐

