dataframe:比较组内的值

dataframe: do comparison of values within groups

输入数据:

data = {'G1': ['a', 'a', 'a', 'a', 'a', 'b', 'b'], 'G2': ['b', 'b', 'c', 'c', 'd', 'c', 'c'], 'V1': [5, 15, 10, 20, 5, 10, 10], 'V2': [15, 5, 300, 10, 5, 10, 10]}

   | G1  G2  V1   V2
-- + --  --  --  ---
 0 | a   b    5   15
 1 | a   b   15    5
 2 | a   c   10  300
 3 | a   c   20   10
 4 | a   d    5    5
 5 | b   c   10   10
 6 | b   c   10   10

输出

   | G1  G2  V1   V2  E1  E2
-- + --  --  --  ---  --  --
 0 | a   b    5   15   1   1
 1 | a   b   15    5   1   1
 2 | a   c   10  300   1   0
 3 | a   c   20   10   0   1
 4 | a   d    5    5  NA  NA
 5 | b   c   10   10   1   1
 6 | b   c   10   10   1   1

描述:

如何根据以下条件计算列 E1 和 E2:

只有一行的组应该被忽略,并且在 E1 和 E2 中有 None 或 NA

有两行的组:

如果描述不够清楚,请追问。

非常感谢。

可能不是最佳性能,但这是使用自定义函数的一种方法 np.diag:

def func(arr):
    arr = arr.to_numpy()
    if len(arr)<2: return pd.DataFrame([[np.NaN, np.NaN]])
    x, y = np.diag(arr), np.diag(np.fliplr(arr))
    return pd.DataFrame([[np.all(x==x[0]), np.all(y==y[0])],
                         [np.all(y==y[0]), np.all(x==x[0])]])

df[["E1", "E2"]] = df.groupby(["G1","G2"])[["V1","V2"]].apply(func).reset_index(drop=True)

print (df)

  G1 G2  V1   V2   E1   E2
0  a  b   5   15  1.0  1.0
1  a  b  15    5  1.0  1.0
2  a  c  10  300  1.0  0.0
3  a  c  20   10  0.0  1.0
4  a  d   5    5  NaN  NaN
5  b  c  10   10  1.0  1.0
6  b  c  10   10  1.0  1.0