试图在 Group by pandas 中获取固定值

Trying to get a fixed value in Group by pandas

我正在尝试为此处的每一行计算加权分数。

import pandas as pd
df = pd.read_excel('data.xlsx')
index   firm    sales  burgers

0   McDonalds   100 2

1   McDonalds   100 1

2   McDonalds   100 3

3   McDonalds   100 2

4   McDonalds   100 4

5   Burger King 105 1

6   Burger King 105 1

7   Burger King 105 1

8   Burger King 105 1

9   Burger King 105 3

10  Burger King 105 4

11  Burger King 105 4

Output from df

df[weighted score] = df[Total Sales] * df[total sales / sum(firm name total sales)] # I know this second part is wrong but trying to illustrate what I am going for

我想要的是每个公司(麦当劳、汉堡王)都有一个固定的分母。因此对于麦当劳,它将是所有销售额 (500) 的总和。然后将其除以该行的总销售额(因此每行的销售额为 100/500,即新列中每行的分数为 .2。

然后我将使用 groupby 按公司汇总。

我想要一个固定值分母,我可以在每个订单项中使用它来计算加权平均值

您可以使用groupby('firm')为每个公司分别计算。

在组中,您可以使用 sum()min()max()mean() 等聚合函数(为每个组提供单个值)或使用apply() 计算新列的新值。

此 运行s 函数分别针对每个组,并使用 column / column.sum()

计算列 salese 的百分比值
df['percent'] = df.groupby("firm")['sales'].apply(lambda col: col/col.sum())

或更长

def my_function(col):
    return col/col.sum()

df['percent'] = df.groupby("firm")['sales'].apply(my_function)

最少的工作代码。

我使用io只是为了模拟内存中的文件——所以大家可以简单地复制和运行例子。但是你应该从真实文件中读取数据。

BurgerKing 我删除了 space 以更简单地解析示例数据(因为列之间没有 , 所以我使用 space(s) 作为分隔符)

text = '''index   firm    sales  burgers
0   McDonalds   100 2
1   McDonalds   100 1
2   McDonalds   100 3
3   McDonalds   100 2
4   McDonalds   100 4
5   BurgerKing 105 1
6   BurgerKing 105 1
7   BurgerKing 105 1
8   BurgerKing 105 1
9   BurgerKing 105 3
10  BurgerKing 105 4
11  BurgerKing 105 4'''


import pandas as pd
import io

#df = pd.read_csv(filename)
df = pd.read_csv(io.StringIO(text), sep='\s+')

print('\n--- before ---\n')
print(df)

#print(df.groupby("firm")['sales'].sum())


df['percent'] = df.groupby("firm")['sales'].apply(lambda column: column/column.sum())

print('\n--- after ---\n')
print(df)

结果:

--- before ---

    index        firm  sales  burgers
0       0   McDonalds    100        2
1       1   McDonalds    100        1
2       2   McDonalds    100        3
3       3   McDonalds    100        2
4       4   McDonalds    100        4
5       5  BurgerKing    105        1
6       6  BurgerKing    105        1
7       7  BurgerKing    105        1
8       8  BurgerKing    105        1
9       9  BurgerKing    105        3
10     10  BurgerKing    105        4
11     11  BurgerKing    105        4

--- after ---

    index        firm  sales  burgers   percent
0       0   McDonalds    100        2  0.200000
1       1   McDonalds    100        1  0.200000
2       2   McDonalds    100        3  0.200000
3       3   McDonalds    100        2  0.200000
4       4   McDonalds    100        4  0.200000
5       5  BurgerKing    105        1  0.142857
6       6  BurgerKing    105        1  0.142857
7       7  BurgerKing    105        1  0.142857
8       8  BurgerKing    105        1  0.142857
9       9  BurgerKing    105        3  0.142857
10     10  BurgerKing    105        4  0.142857
11     11  BurgerKing    105        4  0.142857