一组内具有排除条件的大熊猫groupby

时间:2020-09-08 16:15:27

标签: python pandas-groupby

输入DataFrame->>

enter image description here

输出->>

enter image description here

这就是我要计算总和的方式。 A和B列中的值可以不同。

enter image description here

我想以这样的方式聚合此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值。

一切都应该是动态的。

谢谢:)

3 个答案:

答案 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)
相关问题