首页 > 解决方案 > 从不同列中提取值时在熊猫中分配新列时出现问题

问题描述

我在创建具有产品类别的平均折扣百分比的新列时遇到问题。我的数据框由带有订单的行组成。每个订单都有其 ID、商品名称、产品类别、购买月份、零售价和折扣价,我还在百分比列中添加了折扣。我想添加一个新列,其中包含每个类别的平均折扣。简单来说,我想知道家具中的产品平均打折了多少。然后,我想绘制前 3 个类别及其折扣随时间的变化,以查看是否存在季节性(我在考虑条形图)。

这是示例数据

data = {'level_0':  ['Furniture', 'Jewllery','Watches', 'Footwear', 'Furniture', 'Watches'],
        'Discount_in_%': ['0.6', '.2', '0.3', '0.8', '0.7', '0.1']}

data = pd.DataFrame (data, columns = ['level_0','Discount_in_%'])
data

我的问题是生成每个类别的平均折扣列。我正在尝试使用groupby(),但我得到了一列 NaN

df['discount_in_%'] = 1 - df['discounted_price']/df['retail_price']


df['mean_discount_cat'] = df.groupby('level_0')['discount_in_%'].sum()/len(df)
df['mean_discount_cat']

#level_0 is the main category column

0       NaN
1       NaN
2       NaN
3       NaN
4       NaN
         ..
19995   NaN
19996   NaN
19997   NaN
19998   NaN
19999   NaN

我尝试将其总结起来,然后按长度除以,因为当我使用时,mean()我也得到了 NaN。你能指导我如何解决这个问题吗?此外,我不确定如何仅绘制前 3 个类别的平均折扣,但这可能是另一个问题。

我真的很感谢你的帮助。谢谢!

标签: pythonpandasdataframe

解决方案


这里有几个问题。

  1. 初始化数据框。你所拥有的并不完全正确。它混合了两种不同的初始化方式。如果您命名数据中的列,则不会将列参数传递到初始化中。见https://www.geeksforgeeks.org/different-ways-to-create-pandas-dataframe/
data = {'level_0':  ['Furniture', 'Jewllery','Watches', 'Footwear', 'Furniture', 'Watches'],
    'discount_in_%': [0.6, .2, 0.3, 0.8, 0.7, 0.1]}

df = pd.DataFrame (data)

现在你有了一个合适的数据框。

  1. group by 不太对。groupby 函数返回一个特殊对象,该对象需要一个聚合函数(不是列地址)来产生结果:
print(df.groupby('level_0').sum())
  1. 将结果除以 len(df) 没有多大意义。如果您在一个类别中有 1 件商品有 5% 的折扣,那么将其除以整个数据框中的 100 件商品会达到什么效果?我猜你正在寻找

打印(df.groupby('level_0').mean())


推荐阅读