我有一个df:
df = pd.DataFrame({'Company': {0: 'KPMG', 1: 'Google', 2: 'LIC', 3: 'ABC', 4: 'Apple'},
'Sector': {0: 'Finance', 1: 'Tech', 2: 'Finance', 3: 'Finance', 4: 'Tech'},
'Cap': {0: 100, 1: 200, 2: 100, 3: 100, 4: 300}})

我需要计算的比率(新的一栏,需要添加)的上限,每个公司取决于‘部门’。
例如:金融业的总上限为300,因此毕马威的“比率”为100/300。同样的,我也必须为科技公司工作。可能会有新的公司和部门在后面添加,所以它必须是可配置的,这就是为什么我要使用列表格式。
这就是我试过的:
sector_list =['Finance','Tech']
for i in sector_list:
total_cap_per_sector = df.loc[df['Sector'] == i, 'Cap'].sum()
ratios = df.loc[df['Sector'] == i, 'Cap']/total_cap_per_sector
df['Ratio'] = calc
df.to_csv('new_df.csv')new_df看起来像:

我明白,因为它是一个for循环,它只取最后一个循环值,所以我不会得到金融部门的空白。
我想了解如何才能得到sector_list中提到的所有扇区都填充了“比率”值的df?
对于上面的示例,最终结果应该如下所示:

发布于 2021-01-12 21:02:34
groupby和transform可以
df['ratio']=df.groupby('Sector')['Cap'].transform(lambda x:x/x.sum()).round(1)
Company Sector Cap Ratio
0 KPMG Finance 100 0.3
1 Google Tech 200 0.4
2 LIC Finance 100 0.3
3 ABC Finance 100 0.3
4 Apple Tech 300 0.6发布于 2021-01-12 20:58:11
取级数df['Cap'],除以每个组的和,使用transform('sum')创建一个计算的列作为series。关键是使用transform使从组创建的系列与df['Cap']的长度相同。
df = pd.DataFrame({'Company': {0: 'KPMG', 1: 'Google', 2: 'LIC', 3: 'ABC', 4: 'Apple'},
'Sector': {0: 'Finance', 1: 'Tech', 2: 'Finance', 3: 'Finance', 4: 'Tech'},
'Cap': {0: 100, 1: 200, 2: 100, 3: 100, 4: 300}})
df['Ratio'] = round(df['Cap'] / df.groupby('Sector')['Cap'].transform('sum'), 1)
df
Out[1]:
Company Sector Cap Ratio
0 KPMG Finance 100 0.3
1 Google Tech 200 0.4
2 LIC Finance 100 0.3
3 ABC Finance 100 0.3
4 Apple Tech 300 0.6https://stackoverflow.com/questions/65691873
复制相似问题