基于两列字符串相似度及第三列值差异在Pandas DataFrame中识别行对并新增判断列
基于两列字符串相似度及第三列值差异在Pandas DataFrame中识别行对并新增判断列
嘿,我完全get到你的需求了!咱们来一步步解决这个Pandas里的行对识别和新增判断列的问题~
首先先明确下你的核心需求:
- 要基于Col1和Col2的字符串值匹配,找出对应的行组/行对
- 每一组/对里的行,Col3的取值必须同时存在不同的选项(比如一个是Yes,一个是No)
- 新增
new_col列,标记每一行是否满足“存在同组的配对行,且两者Col3值不同”的条件
第一步:模拟示例数据
先把你提供的示例数据用代码还原出来:
import pandas as pd # 模拟你给出的初始DataFrame df = pd.DataFrame({ 'Col1': ['A', 'A', 'B', 'B', 'C', 'C'], 'Col2': ['X', 'X', 'Y', 'Y', 'Z', 'Z'], 'Col3': ['Yes', 'No', 'Yes', 'Yes', 'No', 'Yes'] })
第二步:实现核心逻辑代码
我们可以用groupby分组+条件判断的方式来实现,代码简洁且高效:
# 按Col1和Col2分组,检查每组是否同时包含"Yes"和"No"两种取值 group_validation = df.groupby(['Col1', 'Col2'])['Col3'].apply( lambda group: {'Yes', 'No'}.issubset(group.unique()) ) # 将分组的验证结果映射回原DataFrame,生成new_col df['new_col'] = df.set_index(['Col1', 'Col2']).index.map(group_validation)
第三步:查看最终结果
运行完上面的代码后,你的DataFrame就会变成你想要的最终样式:
| Col1 | Col2 | Col3 | new_col |
|---|---|---|---|
| A | X | Yes | True |
| A | X | No | True |
| B | Y | Yes | False |
| B | Y | Yes | False |
| C | Z | No | True |
| C | Z | Yes | True |
逻辑解释
- 分组:
groupby(['Col1', 'Col2'])会把Col1和Col2字符串完全匹配的行归为同一组,这正好对应你要找的“行对/行组” - 组内验证:
lambda group: {'Yes', 'No'}.issubset(group.unique())会检查当前组的Col3唯一值集合里是否同时包含"Yes"和"No",也就是组内存在Col3值不同的行 - 结果映射:通过
index.map把每个组的验证结果对应到原DataFrame的每一行,确保同一组的所有行都得到相同的new_col值
如果你的实际场景中Col1/Col2是相似字符串而非完全匹配,那可以引入fuzzywuzzy这类模糊匹配库先做字符串相似度分组,不过从你的示例来看完全匹配的场景用上面的代码就足够啦~
备注:内容来源于stack exchange,提问作者Jeff Jelen




