问题描述
我有两个数据框:
df1
df2
并且需要根据df1
在df2['B']
中添加新列。
如果在此迭代中,A
列中的行的内容包含来自B
列中的行的文本,则在新列中写入1。如果不是,则为0。我们还从列B
中获取列的名称。通过下面的示例可能应该更清楚:
解决方法
您可以首先将每个值与df1.A
进行比较,如下:
pd.DataFrame({val:(df1.A.str.contains(val)).map(int) for val in df2.B.unique()})
如果要将其与df1
结合使用,只需使用pd.concat()
:
pd.concat([df1,pd.DataFrame({val:(df1.A.str.contains(val)).map(int) for val in df2.B.unique()})],axis =1)
,
尝试此操作,尝试在每行之后打印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
,
defects = df2['B'].unique()
for i in defects:
df1[i]= df1["A"].map(lambda x: "1" if i in x else "0")