如何解决数据框:比较组内的值
输入数据:
data = {'G1': ['a','a','b','b'],'G2': ['b','c','d','c'],'V1': [5,15,10,20,5,10],'V2': [15,300,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中没有或不存在
具有两行的组:
-
如果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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。