Python 如果值位于另一个数据帧中,请更改列值
我有两个数据帧,如下所示: df1: df2: 我想循环第一个数据帧,如果Materials的值包含一个我可以在df2中找到的单词,那么我会将其更改为1,以便得到: df1: 有什么建议吗Python 如果值位于另一个数据帧中,请更改列值,python,pandas,numpy,Python,Pandas,Numpy,我有两个数据帧,如下所示: df1: df2: 我想循环第一个数据帧,如果Materials的值包含一个我可以在df2中找到的单词,那么我会将其更改为1,以便得到: df1: 有什么建议吗 非常感谢 要在不使用apply的情况下执行此操作,可以使用pd.Series.str.contains和np.where #check if Materials column contains any words from df2. This will also handle both lower case
非常感谢 要在不使用
apply
的情况下执行此操作,可以使用pd.Series.str.contains
和np.where
#check if Materials column contains any words from df2. This will also handle both lower case and upper case matching
df1.Materials = df1.apply(lambda x: 1 if np.in1d(np.array(x.Materials.lower().split()),df2.Mat.str.lower()).any() else 0, axis=1)
df1
Out[2619]:
Materials Col2 Col3
1 1 X Y
2 0 X Y
3 1 X Y
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Materials': ['Wood metal', 'Rock', 'Rock Metal'],
'Col2': ['X', 'X', 'X'], 'Col3': ['Y', 'Y', 'Y']})
df2 = pd.DataFrame({'Mat': ['Metal']})
df1['Materials'] = np.where(df1['Materials'].str.lower().str.contains('|'.join(df2['Mat']).lower()), 1, 0)
要在不使用
apply
的情况下执行此操作,可以使用pd.Series.str.contains
和np.where
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Materials': ['Wood metal', 'Rock', 'Rock Metal'],
'Col2': ['X', 'X', 'X'], 'Col3': ['Y', 'Y', 'Y']})
df2 = pd.DataFrame({'Mat': ['Metal']})
df1['Materials'] = np.where(df1['Materials'].str.lower().str.contains('|'.join(df2['Mat']).lower()), 1, 0)
#check if Materials column contains any words from df2. This will also handle both lower case and upper case matching
df1.Materials = df1.apply(lambda x: 1 if np.in1d(np.array(x.Materials.lower().split()),df2.Mat.str.lower()).any() else 0, axis=1)
df1
Out[2619]:
Materials Col2 Col3
1 1 X Y
2 0 X Y
3 1 X Y
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Materials': ['Wood metal', 'Rock', 'Rock Metal'],
'Col2': ['X', 'X', 'X'], 'Col3': ['Y', 'Y', 'Y']})
df2 = pd.DataFrame({'Mat': ['Metal']})
df1['Materials'] = np.where(df1['Materials'].str.lower().str.contains('|'.join(df2['Mat']).lower()), 1, 0)