我是一个初学者,并不擅长使用Python。我遇到了以下问题,我相信这很容易解决.让我们假设我们有下面的'df_initial'结构作为输入。
print (df)
Product type 0 1 2 3 4 5 6
0 BURGUNDY actual 645 600 720 640 500 320 300
1 BORDEAUX actual 730 730 710 500 500 450 450
2 CHAMPAGNE actual 320 260 280 100 100 100 0
3 BURGUNDY objective 800 760 720 640 600 560 520
4 BORDEAUX objective 750 730 710 690 670 550 630
5 CHAMPAGNE objective 500 490 480 0 0 0 0
字符串
我创建了下面的pivot表:
df_pivot = df_initial.pivot_table(index='Product', columns=['type'],
aggfunc=np.sum)
型
x1c 0d1x的数据
我想计算每个位置1、2、3、...、6处的每个产品的实际/目标比率,附加条件是,如果除法不可能,则比率应设置为100%(对于“目标”列中的值等于零的任何行)。
ratio_df = pd.DataFrame(index=df_pivot.index)
型
我定义了如下函数:
def division(a, b):
if b == 0:
return 1
else:
return a/b
型
然后我试着应用这个函数:
for col in df_pivot.columns:
if col[1] == 'objective':
continue
ratio_df[col[0]] = division (df_pivot[(col[0], 'actual')] , df_pivot[(col[0], 'objective')])
型
这将返回:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
型
我明白为什么这不能工作,但我不知道如何正确地编写脚本。
我想要一张这样的table:
的
我试着把函数改成:
def division(a, b):
if b.values[0] == 0:
return 1
else:
return a / b.values[0]
型
然后t:
ratio_df[col[0]] = df_pivot[col].apply(division, b=df_pivot.loc[:, (col[0], 'objective')])
型
但这并不产生正确的输出。
2条答案
按热度按时间jfgube3f1#
您可以使用
groupby.sum
,然后使用loc
,replace
将Inf
切片为1,并可选地使用applymap
进行格式化:字符串
或者使用初始的
pivot_table
和swaplevel
来更轻松地切片:型
applymap
替换为map
。*输出量:
型
1aaf6o9v2#
您可以聚合
GroupBy.sum
,除以DataFrame.xs
,并通过DataFrame.xs
选择MultiIndex
级别,最后使用DataFrame.replace
替换INF
,乘以100
,并通过1
替换缺失值:字符串
对于百分比,添加
DataFrame.applymap
并删除乘以100
的倍数:型