试图在 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
我正在尝试为此处的每一行计算加权分数。
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