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
有两行的组:
如果V1第一行的值等于V2第二行的值,则E1在第一行应为1(或True),在第二行应为E2。
如果V1第二行的值等于V2第一行的值,则E1在第二行应为1(或True),E2在第一行。
如果值不相等,则相应的位置应为 0(或 False)。
如果描述不够清楚,请追问。
非常感谢。
可能不是最佳性能,但这是使用自定义函数的一种方法 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
输入数据:
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
有两行的组:
如果V1第一行的值等于V2第二行的值,则E1在第一行应为1(或True),在第二行应为E2。
如果V1第二行的值等于V2第一行的值,则E1在第二行应为1(或True),E2在第一行。
如果值不相等,则相应的位置应为 0(或 False)。
如果描述不够清楚,请追问。
非常感谢。
可能不是最佳性能,但这是使用自定义函数的一种方法 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