我想根据其他表中的值附加字符串。
DF1:
s1 s2 s3 s4 s5 s6
-----------------
1 1 1 0 1 1
和 Df2 一样
DF2:
Tech_ID Std_Id s1_Norm s2 Norm S3 Norm S4_Norm S5 Norm S6_Norm
----------------------------------------------------
1 1 11 01 10 11 00 01
1 7 01 11 01 11 01 10
2 4 00 10 00 11 10 11
3 8 10 11 01 01 11 00
.
.
.
现在想根据 DF1 值生成字符串
对于第一行。 s1+s1_Norm+s2+s2_Norm+s3+s3_Norm+s5+s5_Norm+s6+s6_Norm
s4 和 s4_norm 不用于字符串计算,因为 s4 值为 0。
同样地,任何 S 系列值 0 然后在字符串生成中不考虑该 s 位和 s_Norm 位的值。
预期结果:
Tech_ID Std_Id Result
---------------------------------
1 1 111101110100101
1 7 101111101101110
2 4 100110100110111
3 8 100111101111100
.
.
.
同样的,如果 s4=1 和 s3=0,那么 s3 和 s3_Norm 不应该在字符串生成中考虑。
答案 0 :(得分:1)
您可以将 df1
连接到 df2
作为字符串,然后使用矩阵乘法 @
:
(df1.astype(str).values + df2) @ df1.T.values
输出:
0
0 111101110100101
1 101111101101110
2 100110100110111
答案 1 :(得分:0)
Quang Hoang 的矩阵乘法令人印象深刻。也可以将 apply()
与 itertools.compress()
一起使用。 itertools.compress(data, selectors)
用于从数据中过滤元素,其中选择器中相应元素的计算结果为 False
。
import itertools
d_ = (df1.astype(str).values + df2.iloc[:,2:]).apply(lambda row: ''.join(itertools.compress(row.tolist(), df1.loc[0].tolist())), axis=1)
df_ = pd.concat([df2.iloc[:, :2], d_], axis=1)
# print(df_)
Tech_ID Std_Id 0
0 1 1 111101110100101
1 1 7 101111101101110
2 2 4 100110100110111
3 3 8 110111101111100