输入DataFrame->>
输出->>
这就是我要计算总和的方式。 A和B列中的值可以不同。
我想以这样的方式聚合此DataFrame:对于列A的公共值,我必须忽略的唯一当前值,但必须考虑B的所有值,并且必须考虑列c的总和恢复到先前的状态。
例如- 1--对于A = a和B = 1,对于B = 1,我必须忽略C列的值,但是我必须添加C列的值,其中A == a和b!= 1的列,总和应该是5(2 + 3)
2--对于组A = a和B = 2,我必须忽略B = 2,但必须考虑A = a和B!= 2的位置,因此对于A = a和B!= 2,总和为4 (1 +3)。
3 ---对于组A = a,B = 3,我必须忽略B = 3,但必须考虑A = a和B!= 3的位置,因此对于A = a和B!= 3,总和为3(1 + 2)。
我必须拥有一百万个A的值,一个A可以具有任意数量的B值。
一切都应该是动态的。
谢谢:)
答案 0 :(得分:1)
您可以对数据框行使用简单的迭代:
# get rows except the current show
ss['sum'] = [ss.iloc[ss.index.difference([x]),1].sum() for x in range(ss.shape[0])]
print(ss)
A B sum
0 a 1 5
1 a 2 4
2 a 3 3
样本数据
ss = pd.DataFrame({'A': list('aaa'), 'B': [1,2,3]})
答案 1 :(得分:0)
这是您可以尝试的东西。
首先,我将基于A列的数据分组为新的数据帧dfsum
然后我将C列转换为总和。然后从原始C列中减去总和即可得到所需的值。
import pandas as pd
df = pd.DataFrame({'A': list('aaabbb'), 'B': [1,2,3,1,2,3], 'C': [1,2,3,4,5,6]})
dfsum = df.groupby(['A'])
n = dfsum['C'].transform('sum')
df['sum'] = (n - df['C'])
print (df)
输出如下:
A B C sum
0 a 1 1 5
1 a 2 2 4
2 a 3 3 3
3 b 1 4 11
4 b 2 5 10
5 b 3 6 9
答案 2 :(得分:0)
我有一个类似的问题。也许您现在已经解决了,但是这就是我所做的。 我会使用一个函数来计算您描述的特殊金额。
def exclusion_sum(row, df):
exclusion_mask = (df['A'] == row['A']) & (df['B'] != row['B'])
return df[exclusion_mask]['C'].sum() + row['B']
df['sum'] = df.apply(lambda x: exclusion_sum(x, df), axis=1)