【问题标题】:multiply each group by a specific value from a list in python groupby将每个组乘以 python groupby 列表中的特定值
【发布时间】:2020-07-15 18:06:27
【问题描述】:

我有以下数据框和列表。

d = ({
    'Item' : ['a','a','a','b','b','b','b'],                 
    'Count' : [0,1,2,3,4,5,6],                                      
    })

df = pd.DataFrame(data = d)

list_factor=[10,100] # a list of factors with same length as the unique Items in dataframe.

现在我想为每个项目,将计数乘以对应于该项目的 list_factor 元素。例如,a 中的所有计数都将乘以 10,b 中的所有计数都将乘以 100。所以最终的数据帧将如下所示:


'Item' : ['a','a','a','b','b','b','b'],                 
'Count' : [0,10,20,300,400,500,600],                                      
    

我尝试使用 groupby 函数并对其应用乘法函数,但我只能对常量值执行此操作,而不是列表中的值。这是我所做的:

df.groupby('Item')['Count'].apply(lambda x : x*list_factor[?!])

这只是一个示例数据框以及我想要达到的内容。实际上,我有一个包含 1000 个不同项目的数据框,因此 list_factor 的长度为 1000。(数据框的总行数为 40000)

【问题讨论】:

  • 究竟基于哪个逻辑?如果Item中唯一值的数量和list_factor的长度不匹配怎么办?
  • 他们确实匹配。这是我的具体问题。假设您在因素列表中对每个项目都有一个特定因素。

标签: python-3.x pandas pandas-groupby


【解决方案1】:

您可以使用factorize 提取Item 的顺序,然后使用numpy 索引来传播因子:

factors = np.array(list_factor)[df.Item.factorize()[0]]

df['Count'] *= factors

输出:

  Item  Count
0    a      0
1    a     10
2    a     20
3    b    300
4    b    400
5    b    500
6    b    600

【讨论】:

    【解决方案2】:

    Quang Hoang 的回答很有趣——我不熟悉因式分解。 另一种方法是创建一个字典:

    item_values = df['Item'].unique()
    factor_dict = {item_values[i]: list_factor[i] for i in range(len(item_values))}
    
    
    df['Count'] = df.apply(lambda x: x['Count'] * factor_dict.get(x['Item']), axis=1)
    

    结果:

      Item  Count
    0    a      0
    1    a     10
    2    a     20
    3    b    300
    4    b    400
    5    b    500
    6    b    600
    

    【讨论】:

    • 感谢您的回答!这是一种非常有趣的使用字典的方法。我接受了 Quang 的回答,因为它对于我拥有的大型数据框来说要快得多。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多