你好,我有两个如下所示的数据框
DF1 Alpha | Numeric | Special and | 1 | @ or | 2 | # lol ok | 4 | & DF2 with single column Content boy or girl school @ morn pyc LoL ok student Chandra
我想搜索 DF1 中的任何列是否包含 DF2 内容列中的任何关键字,并且输出应该在新的 DF 中
`df11 = (df1.unstack() .reset_index(level=2,drop=True) .rename_axis(('col_order','col_name')) .dropna() .reset_index(name='val_low')) df22 = (df2['Content'].str.split(expand=True) .stack() .rename('val') .reset_index(level=1,drop=True) .rename_axis('idx') .reset_index())` df22['val_low'] = df22['val'].str.lower() df = (pd.merge(df22, df11, on='val_low', how='left') .dropna(subset=['col_name']) .sort_values(['idx','col_order']) .drop_duplicates(['idx'])) df = (pd.concat([df2, df.set_index('idx')], axis=1) .fillna({'col_name':'Other'})[['val','col_name','Content']])
但它没有考虑到 lol ok 之间的空格
expected_output_DF val col_name Content 0 or Alpha boy or girl 1 @ Special school @ morn 2 lol ok Alpha pyc LoL ok student 3 NaN Other Chandra
有人能帮我吗
您的代码已经很接近目标,但 df1 中的 lol ok 包含空格,而在 df2 中,这两个词需要被视为一个整体。您可以通过将 df2['Content'] 中的每一行视为整体字符串,而不是拆分成单词来解决这个问题。可以使用 apply 来遍历 df2['Content'] 的每一行,然后在 df1 的每一行中检查匹配情况。
df1
lol ok
df2
df2['Content']
apply
以下是更新后的代码示例:
import pandas as pd # 创建数据框 df1 = pd.DataFrame({ 'Alpha': ['and', 'or', 'lol ok'], 'Numeric': ['1', '2', '4'], 'Special': ['@', '#', '&'] }) df2 = pd.DataFrame({ 'Content': ['boy or girl', 'school @ morn', 'pyc LoL ok student', 'Chandra'] }) # 将 df1 转换为长格式以便于匹配 df1_melted = df1.melt(var_name='col_name', value_name='val_low').dropna() df1_melted['val_low'] = df1_melted['val_low'].str.lower() # 统一为小写 # 创建一个函数检查 df2 中的每个内容是否包含 df1 中的关键字 def match_content(content): content_lower = content.lower() for _, row in df1_melted.iterrows(): if row['val_low'] in content_lower: return pd.Series([row['val_low'], row['col_name'], content]) return pd.Series([None, 'Other', content]) # 应用匹配函数 result = df2['Content'].apply(match_content) result.columns = ['val', 'col_name', 'Content'] # 显示结果 print(result)
melt
match_content
val_low
col_name
DataFrame
执行该代码将产生如下预期结果:
val col_name Content 0 or Alpha boy or girl 1 @ Special school @ morn 2 lol ok Alpha pyc LoL ok student 3 NaN Other Chandra
这样即可得到预期的结果,并且保留了包含空格的关键字。