Excel Pandas 中的 Sumproduct 等价物
Excel Sumproduct equivalent in Pandas
我有一个简单的练习,但在 Pandas 中找不到简单的解决方案。我的数据框具有以下形式:
A B C D A1 B1 C1 D1
0 0.0 0.0 0.0 0.090909 0.247747 0.162398 0.381459 0.208396
1 0.0 0.0 0.0 0.090909 0.250811 0.168629 0.374599 0.205961
2 0.0 0.0 0.0 0.090909 0.252173 0.168521 0.374551 0.204755
我想始终使用 AA1 + BB1 .. .D*D1
来计算列的和积
我找到了解决办法,但是有点乱,列数一增加就不适合了。有什么 pythonic 方法可以解决这个问题吗?使用 Excel 我会给你 sumproduct
函数。
当前解决方案:
df['SP'] = df[["A", 'A1']].prod(axis=1) + df[["B", 'B1']].prod(axis=1) + df[["C", 'C1']].prod(axis=1) + df[["D", 'D1']].prod(axis=1)
应该导致:
df[SP]
0.018945
0.018724
0.018614
类似于 Chris 的评论,但您可以忽略列名并改为传递范围:
num_base_cols=4
num_repeat = 2
col_groups = np.tile(np.arange(num_base_cols), num_repeat)
df.groupby(col_groups, axis=1).prod().sum(1)
输出:
0 0.018945
1 0.018724
2 0.018614
dtype: float64
您可以识别 'left' 和 'right' 上的列,然后乘以 sum(axis=1)
。
请注意,我假设您的所有列都遵循 col_name
/col_name<number>
约定(如果不是这种情况,您将必须手动识别列表中的列名称 cols_left
和 cols_right
).
import pandas as pd
df = pd.DataFrame(data={
'A': [0,0,0],
'B': [0,0,0],
'C': [0,0,0],
'D': [0.090909, 0.090909, 0.090909],
'A1': [0.247747,0.250811, 0.252173],
'B1': [0.162398, 0.168629, 0.168521],
'C1': [0.381459, 0.374599, 0.374551],
'D1': [0.208396, 0.205961, 0.204755]
})
cols_left = [c for c in df.columns if '1' not in c]
cols_right = [c for c in df.columns if '1' in c]
out = (df[cols_left] * df[cols_right].values).sum(axis=1)
out:
0 0.018945
1 0.018724
2 0.018614
我有一个简单的练习,但在 Pandas 中找不到简单的解决方案。我的数据框具有以下形式:
A B C D A1 B1 C1 D1
0 0.0 0.0 0.0 0.090909 0.247747 0.162398 0.381459 0.208396
1 0.0 0.0 0.0 0.090909 0.250811 0.168629 0.374599 0.205961
2 0.0 0.0 0.0 0.090909 0.252173 0.168521 0.374551 0.204755
我想始终使用 AA1 + BB1 .. .D*D1
来计算列的和积我找到了解决办法,但是有点乱,列数一增加就不适合了。有什么 pythonic 方法可以解决这个问题吗?使用 Excel 我会给你 sumproduct
函数。
当前解决方案:
df['SP'] = df[["A", 'A1']].prod(axis=1) + df[["B", 'B1']].prod(axis=1) + df[["C", 'C1']].prod(axis=1) + df[["D", 'D1']].prod(axis=1)
应该导致:
df[SP]
0.018945
0.018724
0.018614
类似于 Chris 的评论,但您可以忽略列名并改为传递范围:
num_base_cols=4
num_repeat = 2
col_groups = np.tile(np.arange(num_base_cols), num_repeat)
df.groupby(col_groups, axis=1).prod().sum(1)
输出:
0 0.018945
1 0.018724
2 0.018614
dtype: float64
您可以识别 'left' 和 'right' 上的列,然后乘以 sum(axis=1)
。
请注意,我假设您的所有列都遵循 col_name
/col_name<number>
约定(如果不是这种情况,您将必须手动识别列表中的列名称 cols_left
和 cols_right
).
import pandas as pd
df = pd.DataFrame(data={
'A': [0,0,0],
'B': [0,0,0],
'C': [0,0,0],
'D': [0.090909, 0.090909, 0.090909],
'A1': [0.247747,0.250811, 0.252173],
'B1': [0.162398, 0.168629, 0.168521],
'C1': [0.381459, 0.374599, 0.374551],
'D1': [0.208396, 0.205961, 0.204755]
})
cols_left = [c for c in df.columns if '1' not in c]
cols_right = [c for c in df.columns if '1' in c]
out = (df[cols_left] * df[cols_right].values).sum(axis=1)
out:
0 0.018945
1 0.018724
2 0.018614