请求解释Pandas中计算车辆价格颜色占比的核心代码
咱们把这段核心代码拆成小块,一步步看它在做什么:
df.loc[i, 'Color']
取DataFrame里第i行的Color列值,也就是当前循环到的这辆车的颜色。比如你的原始数据里第0行是红色,那这里就返回'Red'。df['Color'] == df.loc[i, 'Color']
生成一个布尔数组(由True/False组成),数组每个位置对应原DataFrame的一行:如果该行颜色和当前车颜色一致,就标True,否则标False。比如当前车是红色,所有红色行都会是True,其他颜色行是False。df[df['Color'] == df.loc[i, 'Color']]
用上面的布尔数组过滤原DataFrame,得到一个仅包含当前车同颜色所有车辆的子数据集。比如当前车是红色,这里就把所有红色车的数据单独提取出来。df[df['Color'] == df.loc[i, 'Color']]['Price']
从这个同颜色子数据集中,提取出Price列,得到同颜色所有车的价格列表(Pandas Series格式)。比如红色车价格是[10000,20000],这里就返回这个Series。df[df['Color'] == df.loc[i, 'Color']]['Price'].sum()
对上面的价格列表求和,算出当前颜色所有车辆的总价格。比如红色车总价格就是30000。df['Price'][i]
取当前第i辆车的价格,也就是你要计算占比的那辆车的单独价格。最终除法运算
用当前车的价格除以同颜色总价格,得到的就是这辆车价格在对应颜色总价格中的占比,结果赋值给cost。
补充:更高效的Pandas写法
你现在用循环的方式虽然能得到正确结果,但Pandas天生适合向量化操作,不用写循环也能实现相同效果,而且数据量大的时候速度快很多:
df['Cost_Ratio'] = df['Price'] / df.groupby('Color')['Price'].transform('sum')
这里groupby('Color')按颜色分组,transform('sum')会把每组的总价格自动匹配到原DataFrame的每一行,然后直接用每行价格除以对应组的总价格,一步生成所有占比。
内容的提问来源于stack exchange,提问作者goldraker34

