【问题标题】:How do I apply this function to each group in my DataFrame如何将此函数应用于我的 DataFrame 中的每个组
【发布时间】:2016-03-18 16:46:33
【问题描述】:

对于 Pandas 来说相对较新,来自 R 背景。我有一个像这样的DataFrame

import pandas as pd
import numpy as np

df = pd.DataFrame({'ProductID':[0,5,9,3,2,8], 'StoreID':[0,0,0,1,1,2]})

   ProductID  StoreID
0          0        0
1          5        0
2          9        0
3          3        1
4          2        1
5          8        2

对于每个 StoreID,如何根据订购的 ProductID 将df 的行标记为 1、2、...?那么,我如何标准化这些等级呢?换句话说,我如何实现以下目标

df['Product_Rank_Index'] = np.array([1,2,3,2,1,1])
df['Product_Rank_Index_Normalized'] = np.array([1/3, 2/3, 3/3, 2/2, 1/2, 1/1])

   ProductID  StoreID  Product_Rank_Index  Product_Rank_Index_Normalized
0          0        0                   1                       0.333333
1          5        0                   2                       0.666667
2          9        0                   3                       1.000000
3          3        1                   2                       1.000000
4          2        1                   1                       0.500000
5          8        2                   1                       1.000000

我尝试使用df.groupby('StoreID') 做一些事情,但无法正常工作。

【问题讨论】:

  • 我不是您所在领域的专家,但您的标准化排名指数似乎不太标准化。它们似乎与商店中的产品数量成线性关系。

标签: python pandas dataframe


【解决方案1】:

感谢this 回答。

df.groupby('StoreID').ProductID.apply(lambda x: x.rank()/len(x))

【讨论】:

    【解决方案2】:

    Ben 正如你所指出的,你可以这样做:

     df.groupby('StoreID').ProductID.apply(lambda x: x.rank()/len(x))
    

    请注意,使用transform 可以达到相同的结果,但更好的做法和更快(大约快一倍):

    In [32]: %timeit df.groupby('StoreID').ProductID.apply(lambda x: x.rank()/len(x))
    100 loops, best of 3: 2.26 ms per loop
    
    In [31]: %timeit df.groupby('StoreID').ProductID.transform(lambda x: x.rank()/len(x))
    1000 loops, best of 3: 1.3 ms per loop
    

    【讨论】:

      【解决方案3】:

      您可以先对值进行排序然后分组,如下所示

      >>> import pandas as pd
      >>> df = pd.DataFrame({'ProductID':[0,5,9,3,2,8], 'StoreID':[0,0,0,1,1,2]})
      >>> df.sort(['StoreID', 'ProductID'], inplace=True)
      >>> df                
         ProductID  StoreID 
      0          0        0 
      1          5        0 
      2          9        0 
      4          2        1 
      3          3        1 
      5          8        2 
      >>> df.groupby('StoreID').apply(lambda grp: range(1, len(grp)+1))
      StoreID
      0    [1, 2, 3]
      1       [1, 2]
      2          [1]
      >>> df.groupby('StoreID').apply(lambda grp: range(1, len(grp)+1)).sum()
      [1, 2, 3, 1, 2, 1]
      >>> df['Rank'] = df.groupby('StoreID').apply(lambda grp: range(1, len(grp)+1)).sum()
      >>> df
         ProductID  StoreID  Rank
      0          0        0     1
      1          5        0     2
      2          9        0     3
      4          2        1     1
      3          3        1     2
      5          8        2     1
      

      然后您可以按照自己的方式规范您的排名..

      【讨论】:

        猜你喜欢
        • 2017-01-21
        • 2023-01-10
        • 2017-12-09
        • 2022-11-25
        • 2018-06-06
        • 2020-08-11
        • 1970-01-01
        • 2021-05-25
        • 2017-06-14
        相关资源
        最近更新 更多