【问题标题】:Normalize column in pandas dataframe by sum of grouped values of another column通过另一列的分组值的总和规范化熊猫数据框中的列
【发布时间】:2017-01-31 21:02:15
【问题描述】:

我在尝试规范化 pandas 数据框中的某些列条目时有点卡住了。所以我有一个这样的数据框:

df = pd.DataFrame({
        'user':[0,0,1,1,1,2,2], 
        'item':['A','B', 'A', 'B','C','B','C'],
        'bought':[1,1,1,3,3,2,3]})
df
bought|item|user
----------------
1     |A   |0
1     |B   |0
1     |A   |1
3     |B   |1
3     |C   |1
2     |B   |2
3     |C   |2

我想通过每个用户购买的总数来标准化购买的每件商品的数量。

换句话说,对于“购买”的每个条目,我想将其除以为该用户购买的总数的总和(作为另一列)。在这种情况下,我想要的输出是这样的(但“标准化”列不必是分数):

bought|item|user|normalized
--------------------------
1     |A   |0   |1/2
1     |B   |0   |1/2
1     |A   |1   |1/7
3     |B   |1   |3/7
3     |C   |1   |3/7
2     |B   |2   |2/5
3     |C   |2   |3/5

到目前为止,我已按用户分组并按用户获得总和:

grouped = df.groupby(by='user')
grouped.aggregate(np.sum)

但在这一点上,我被困住了。谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    pandasmap

    df.assign(normalized=df.bought.div(df.user.map(df.groupby('user').bought.sum())))
    

    pandastransform

    df.assign(normalized=df.bought.div(df.groupby('user').bought.transform('sum')))
    

    两者都有

       bought item  user  normalized
    0       1    A     0    0.500000
    1       1    B     0    0.500000
    2       1    A     1    0.142857
    3       3    B     1    0.428571
    4       3    C     1    0.428571
    5       2    B     2    0.400000
    6       3    C     2    0.600000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-11
      • 2014-12-12
      • 2020-10-21
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多