如何为从另一个数据框创建的变量获取 1/0 值(按条件)?(熊猫/NUMPY)



我有两个数据帧,假设'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

首先,我们将两个数据帧一起mergeY。然后我们将Xpivot到列。最后,我们使用DataFrame.filter来获取正确的列,并使用np.where有条件地应用您的逻辑来获取列中的10

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

最新更新