如何根据条件生成字符串(追加列)

时间:2021-04-11 06:04:50

标签: python pandas matrix

我想根据其他表中的值附加字符串。

DF1:

Tech_ID  s1  s2  s3  s4  s5  s6
-------------------------------
   1      1   1   1   0   1   1
   2      1   0   1   1   1   0  
   3      1   1   0   0   1   1 

Df1 = {'Tech_ID':[1,2,3],
        'S1':[1,1,1], 'S2':[1,0,1], 'S3': [1,1,0],  
           'S4':[0,1,0],'S5':[1,1,1],'S6':[1,0,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
   2        2       11        01       00       10       01       10
.
.
. 
   
  Df2 = {'Tech_ID':[1,1,2,3,2], Std_Id [1,7,4,8,2]
        'S1_norm':[11,01,00,10,11], 'S2_norm':[01,11,10,11,01],
         'S3_norm': [10,01,00,01,00], 'S4_norm':[11,11,11,01,10], 
          'S5_norm': [00,01,10,11,01], 'S2_norm':[01,10,11,00,10],}​

现在想根据 DF1 值生成字符串

对于 Tech_ID:1

  • s1+s1_Norm+s2+s2_Norm+s3+s3_Norm+s5+s5_Norm+s6+s6_Norm 因为 s4=0 所以不考虑字符串中 s4 & s4_Norm 的值.

Tech_ID 的相同方法:2

  • s1+s1_Norm+s3+s3_Norm+s4+s4_Norm+s5+s5_Norm 这里相同 s2 和 s6 是 0 所以 s2,s2_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      100100111110
  3        8      100111111100
  2        2      111100110101
.
.
.

同样的,如果 s4=1 和 s3=0,那么 s3 和 s3_Norm 不应该在字符串生成中考虑。

尝试使用下面的代码,不要考虑 Tech_id 不在其中,但不会成功。

import itertools

#(df1.astype(str).values + df2) @ df1.T.values
-------

d_ = (df1.astype(str).values + df2.iloc[:,3:]).apply(lambda row: ''.join(itertools.compress(row.tolist(), df1.loc[0].tolist())), axis=1)

df_ = pd.concat([df2.iloc[:, :2], d_], axis=1)

1 个答案:

答案 0 :(得分:1)

您可以使用应用/合并方法来实现。我添加了注释来解释代码。

df1['cols_to_use'] = np.NAN
df1['cols_to_use'] = df1.apply(lambda x: [col for col in df1.columns.values[1:-1] if x[col]!=0], axis=1) # it'll create the list of columns where value is not 0.
merged_df = df2.merge(df1, on = 'Tech_ID', how= 'inner') #merging dataframes so that we can use the previous result and make the equation.
merged_df['result'] = np.NaN
merged_df['result'] = merged_df.apply(
    lambda x: ''.join(
        str(x[col]) + str(x[f'{col}_Norm']) for col in x['cols_to_use']
    ),
    axis=1,
) # this is the required equation it'll add all col and col_num where value is not zero. 

将给出输出 -

<头>
Tech_ID Std_Id s1_Norm s2_Norm s3_Norm s4_Norm s5_Norm s6_Norm s1 s2 s3 s4 s5 s6 cols_to_use 结果
1 1 11 01 10 11 00 01 1 1 1 0 1 1 ['s1', 's2', 's3', 's5', 's6'] 111101110100101
1 7 01 11 11 11 01 10 1 1 1 0 1 1 ['s1', 's2', 's3', 's5', 's6'] 101111111101110
2 4 00 10 11 11 10 11 1 0 1 1 1 0 ['s1', 's3', 's4', 's5'] 100111111110
2 2 11 01 10 10 01 10 1 0 1 1 1 0 ['s1', 's3', 's4', 's5'] 111110110101
3 8 10 11 01 01 11 00 1 1 0 1 1 1 ['s1', 's2', 's4', 's5', 's6'] 110111101111100