我有两个数据帧,假设'df1'和'df2'。 在"df1"中有三个变量:"X","Y","Z"。 "X"和"Y"表示 ID,我为每对 (X,Y) 进行了计算(无论是哪一对)并得到了"Z"变量。
在"df2"中有两个变量:"Y","W"。 "Y"与之前在"df1"中提到的 ID 相同, 而"W"是其他变量(无论如何)。
现在,我想在"df2"中创建(使用熊猫)变量,它们是"df1"中的"X"ID, 对于创建的每个变量,如果特定对 (X,Y) 的"Z"值等于或大于"4"(>= 4),并且 (&) 特定"W"值等于或大于"5"(>= 5),则为"df2"中的每一行获取值"1",否则为"0"。
这是数据框的演示:
DF1:
X Y Z
1 a 1
1 b 9
1 c 4
2 a 1
2 b 7
2 c 3
3 a 4
3 b 3
3 c 6
DF2:
Y W
a 7
a 3
b 5
b 7
b 2
c 6
c 9
c 4
c 8
预期成果(df2):
Y W 1 2 3
a 7 0 0 1
a 3 0 0 0
b 5 1 1 0
b 7 1 1 0
b 2 0 0 0
c 6 1 0 1
c 9 1 0 1
c 4 0 0 0
c 8 1 0 1
首先,我们将两个数据帧一起merge
列Y
。然后我们将X
值pivot
到列。最后,我们使用DataFrame.filter
来获取正确的列,并使用np.where
有条件地应用您的逻辑来获取列中的1
和0
:
new = df2.merge(df1,on='Y').pivot_table(index=['Y', 'W'], columns='X', aggfunc='sum').reset_index()
new.columns = [c1 if c2 == '' else str(c2) for c1, c2 in new.columns]
for col in new.filter(regex='d$').columns:
new[col] = np.where(new['W'].ge(5) & new[col].ge(4),1,0)
输出
Y W 1 2 3
0 a 3 0 0 0
1 a 7 0 0 1
2 b 2 0 0 0
3 b 5 1 1 0
4 b 7 1 1 0
5 c 4 0 0 0
6 c 6 1 0 1
7 c 8 1 0 1
8 c 9 1 0 1