Python 3.x 根据列A和B的内容创建列X1和Xn

Python 3.x 根据列A和B的内容创建列X1和Xn,python-3.x,pandas,numpy,Python 3.x,Pandas,Numpy,我有两个数据帧: df1 并且需要一个基于df2['B']的附加组件df1新列。 在新列中,如果列A中的行的内容包含此迭代的列B中的行的文本,则在该列中写入1。如果不是,则为0。我们还从columnB中获取列的名称。下面的例子可能会更清楚: 您可以将每个值与df1.A进行比较,如下所示: pd.DataFrame({val:(df1.A.str.contains(val)).map(int) for val in df2.B.unique()}) 如果您想将其与df1结合使用,只需使用p

我有两个数据帧:

df1

并且需要一个基于
df2['B']
的附加组件
df1
新列。 在新列中,如果列
A
中的行的内容包含此迭代的列
B
中的行的文本,则在该列中写入1。如果不是,则为0。我们还从column
B
中获取列的名称。下面的例子可能会更清楚:


您可以将每个值与
df1.A进行比较,如下所示:

pd.DataFrame({val:(df1.A.str.contains(val)).map(int) for val in df2.B.unique()})
如果您想将其与
df1
结合使用,只需使用
pd.concat()


尝试此操作,尝试在每行之后打印df,以便更好地理解:

df = df1.merge(df2, on=['N'], how='left').fillna('0')
df = df.pivot(index=['N', 'A_x'], columns=['A_y'], values=['A_y']).fillna(0)
df.columns = df.columns.map('_'.join)
df = df.replace('\w+', 1, regex=True)
df.reset_index(inplace=True)
df.columns = df.columns.str.replace('A_y_', '', regex=True).str.replace('A_x', 'A')
df.drop(columns=['0'], inplace=True)
print(df)


   N        A  asd  asd asd  asdasd
0  1  asd asd    0        1       0
1  2      asd    1        0       0
2  3   asdasd    0        0       1
3  4      xcv    0        0       0
4  5   asdasd    0        0       0

如果未找到匹配项,则仍需要创建该列,该列将包含0。请将数据添加为文本,请参见,图像不可复制。请使用问题上的编辑链接添加其他信息。“发布答案”按钮只能用于完整回答问题-
pd.concat([df1, pd.DataFrame({val:(df1.A.str.contains(val)).map(int) for val in df2.B.unique()})], axis =1)
df = df1.merge(df2, on=['N'], how='left').fillna('0')
df = df.pivot(index=['N', 'A_x'], columns=['A_y'], values=['A_y']).fillna(0)
df.columns = df.columns.map('_'.join)
df = df.replace('\w+', 1, regex=True)
df.reset_index(inplace=True)
df.columns = df.columns.str.replace('A_y_', '', regex=True).str.replace('A_x', 'A')
df.drop(columns=['0'], inplace=True)
print(df)


   N        A  asd  asd asd  asdasd
0  1  asd asd    0        1       0
1  2      asd    1        0       0
2  3   asdasd    0        0       1
3  4      xcv    0        0       0
4  5   asdasd    0        0       0
defects = df2['B'].unique()
for i in defects:
    df1[i]= df1["A"].map(lambda x: "1" if i in x else "0")