使用辅助函数来封装重复的计算部分可能会有所帮助:
<Table>
<Table.Body>
<Table.Row>
<p>Total Assets/Liabilities:</p>
<td>
{cellValue}
<Icon name={cellValue >= 0 ? "plus" : "minus"} />
</td>
</Table.Row>
</Table.Body>
</Table>
然后,您可以更轻松地表达所有部分分布:
def partial(df,givens,index='c'):
result = df.groupby(givens,as_index=False)['p'].sum().set_index(index)
return result
FAB = pd.DataFrame({'a': [0,1,1],'b': [0,'c': [0,'p': [0.192,0.144,0.048,0.216,0.192,0.064,0.096]})
FC = partial(FAB,['c'])
FA = partial(FAB,['c','a'])
FB = partial(FAB,'b'])
FAB = FAB.set_index('c')
和FA
的乘积可以这样找到:
FB
(此外:请注意,FA_FB = (pd.merge(FA,FB,on=['c'],suffixes=['a','b']))
FA_FB['p'] = (FA_FB['pa'] * FA_FB['pb']) / FC['p']
FA_FB = FA_FB.drop(['pa','pb'],axis=1)
,FAB
,FA
和FB
均由FC
值索引。这使我们能够对这些DataFrame就像
c
即使(FA_FB['pa'] * FA_FB['pb']) / FC['p']
与FC
的形状不同。熊猫会根据匹配的索引自动为我们正确对齐行。这就是在FA_FB
帮助函数中使用set_index(index)
的原因。)
现在要测试partial
等于FA_FB
:
FAB
以下是一个可运行块中的上面的代码:
diff = [dfi.set_index(['a','b'],append=True) for dfi in (FA_FB,FAB)]
diff = diff[0] - diff[1]
assert (np.allclose(diff,0))
回想一下:代码所面临的一个问题是必须解决import pandas as pd
import numpy as np
def partial(df,as_index=False)['p'].sum().set_index(index)
return result
FAB = pd.DataFrame({'a': [0,'b'])
FAB = FAB.set_index('c')
# print(FAB)
FA_FB = (pd.merge(FA,axis=1)
# print(FA_FB)
# print(FAB)
diff = [dfi.set_index(['a',0))
的情况,然后为c == 0
重复计算。当然,您可以使用c == 1
来处理此问题。
但是,由于您使用的是Pandas,通常可以(并且更快)避免将数据分解成碎片,而是尝试以影响整个DataFrame整体的操作来表示计算。
因此,在上文中,没有做出任何努力将案例for-loop
与c == 0
分开。相反,c == 1
的值被推到c
中,Pandas的索引自动对齐被用来照顾适合我们的行的合并或算术组合。
以这种方式(而不是使用index
)使用Pandas的另一个好处是,代码可以处理任意数量的不同for-loop
值,而无需更改代码。
本文链接:https://www.f2er.com/3090143.html