python - 检查列值是否在 Pandas 的一个特定列中
问题描述
所以我有一个包含多列的数据框,我想尝试找出我的“ Linked.. ”列中的值是否在名为“ New Names ”的列中,如果是,那么应该设置特定的单元格值这样“cell.value - Yes”或者如果不是“cell.value - No”
import pandas as pd
d = {'New Names': ['a,b,c','a','c,d,e,f','a'], 'Linked Letter 0':
['a','b','c','d'],
'Linked Letter 1': ['c','s','v','None'],
'Linked Letter 2': ['None','None','d','s']}
df_new = pd.DataFrame(data=d)
df_new
Index New Names Linked Letter 0 Linked Letter 1 Linked Letter 2
------- ----------- ----------------- ----------------- -----------------
0 a,b,c a c None
1 a b s None
2 c,d,e,f c v d
3 a d None s
所以预期的结果应该如下表;
Index New Names Linked Letter 0 Linked Letter 1 Linked Letter 2
------- ----------- ----------------- ----------------- -----------------
0 a,b,c a - YES c - YES None
1 a b - NO s - NO None
2 c,d,e,f c - YES v - NO d - YES
3 a d - NO None s - NO
下面提供的解决方案存在一个问题:
问题是映射到 YES 和 NO 到值有时不能按预期工作。例如,即使新名称列中的值在两行中相同,最后得到 YES 的相同值也可能在下一行中得到 NO。
你认为为什么会发生这种情况?
解决方案
您可以使用pd.DataFrame.filter
来过滤Linked
列,使用列表推导来构造布尔数组,最后loc
使用np.where
条件逻辑:
df = pd.DataFrame(data=d)
for col in df.filter(like='Linked'):
bools = [link in new_names for link, new_names in zip(df[col], df['New Names'])]
df.loc[df[col] != 'None', col] += pd.Series(np.where(bools, ' - YES', ' - NO'))
print(df)
Linked Letter 0 Linked Letter 1 Linked Letter 2 New Names
0 a - YES c - YES None a,b,c
1 b - NO s - NO None a
2 c - YES v - NO d - YES c,d,e,f
3 d - NO None s - NO a
推荐阅读
- eclipse - 来自eclipse的spark scala maven构建错误-对象X不是包Y的成员
- macos - Mac w/PostgreSQL 刷新/清空缓存用于性能调整
- python - cmake调用python脚本并验证
- sql - 更改 Power BI 数据集的 SQL 表设计
- sql - Microsoft Access 表显示为空白,但查询正确地从表中提取数据
- azure - .NET Core 2.0 HttpClient Singleton 抛出 502
- android - 禁用滚动视图子,但保持可滚动并启用外观
- git - 我想忽略 .gitignore 中以点 (.) 开头的特定文件
- angularjs - 使用 angular-data-grid 同时过滤两个数据库
- java - Eclipse插件热部署