如何按Family Name分组用组内最小值填充DataFrame的Storage列NaN
问题:按分组用最小值填充NaN值
原始DataFrame
import pandas as pd import numpy as np df = pd.DataFrame ( {'CNN': ['iphone 11 63 GB TMO','iphone 11 128 GB ATT','iphone 11 other carrier','iphone 12 256 GB TMO','iphone 12 64 GB TMO','iphone 12 other carrier'], 'Family Name':['iphone 11', 'iphone 11', 'iphone 11', 'iphone 12', 'iphone 12', 'iphone 12'], 'Storage': [63, 128,np.nan, 256,64, np.nan]})
原始输出
CNN Family Name Storage 0 iphone 11 63 GB TMO iphone 11 63.0 1 iphone 11 128 GB ATT iphone 11 128.0 2 iphone 11 other carrier iphone 11 NaN 3 iphone 12 256 GB TMO iphone 12 256.0 4 iphone 12 64 GB TMO iphone 12 64.0 5 iphone 12 other carrier iphone 12 NaN
需求
按Family Name分组,用每组Storage列的最小值填充该组内的NaN值。
尝试的无效代码
df["Storage"] = df.groupby("Family Name").apply(lambda x: x.fillna(x.min()))
期望输出
CNN Family Name Storage 0 iphone 11 63 GB TMO iphone 11 63.0 1 iphone 11 128 GB ATT iphone 11 128.0 2 iphone 11 other carrier iphone 11 63.0 3 iphone 12 256 GB TMO iphone 12 256.0 4 iphone 12 64 GB TMO iphone 12 64.0 5 iphone 12 other carrier iphone 12 64.0
解决方案
你的代码问题在于groupby.apply()返回的是整个分组后的DataFrame,直接赋值给df["Storage"]会导致维度不匹配。以下两种方法可以解决:
方法1:用transform生成同长度最小值序列后填充
# 计算每组Storage的最小值,生成与原DataFrame同长度的序列 group_min = df.groupby("Family Name")["Storage"].transform("min") # 填充NaN值 df["Storage"] = df["Storage"].fillna(group_min)
方法2:直接对分组后的Storage列操作
df["Storage"] = df.groupby("Family Name")["Storage"].apply(lambda x: x.fillna(x.min()))
两种方法都能实现需求:第一种利用transform更高效,第二种逻辑更直观,直接针对目标列做分组处理。
内容的提问来源于stack exchange,提问作者DSR
相关产品推荐
相关产品推荐

