python - 根据单元格值中的列表检索数据框行
问题描述
我正在尝试从单元格值为列表的熊猫数据框中检索一行。我试过isin
了,但看起来它正在执行 OR 操作,而不是 AND 操作。
>>> import pandas as pd
>>> df = pd.DataFrame([['100', 'RB','stacked'], [['101','102'], 'CC','tagged'], ['102', 'S+C','tagged']],
columns=['vlan_id', 'mode' , 'tag_mode'],index=['dinesh','vj','mani'])
>>> df
vlan_id mode tag_mode
dinesh 100 RB stacked
vj [101, 102] CC tagged
mani 102 S+C tagged
>>> df.loc[df['vlan_id'] == '102']; # Fetching string value match
vlan_id mode tag_mode
mani 102 S+C tagged
>>> df.loc[df['vlan_id'].isin(['100','102'])]; # Fetching if contains either 100 or 102
vlan_id mode tag_mode
dinesh 100 RB stacked
mani 102 S+C tagged
>>> df.loc[df['vlan_id'] == ['101','102']]; # Fails ?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\pandas\core\ops.py", line 1283, in wrapper
res = na_op(values, other)
File "C:\Python27\lib\site-packages\pandas\core\ops.py", line 1143, in na_op
result = _comp_method_OBJECT_ARRAY(op, x, y)
File "C:\Python27\lib\site-packages\pandas\core\ops.py", line 1120, in _comp_method_OBJECT_ARRAY
result = libops.vec_compare(x, y, op)
File "pandas\_libs\ops.pyx", line 128, in pandas._libs.ops.vec_compare
ValueError: Arrays were different lengths: 3 vs 2
我可以将值添加到列表中并进行比较。相反,有什么方法可以让我们使用.loc
方法本身检查列表值吗?
解决方案
要查找列表,您可以使用np.array_equal遍历vlan_id
并比较每个值:
df.loc[[np.array_equal(x, ['101','102']) for x in df.vlan_id.values]]
vlan_id mode tag_mode
vj [101, 102] CC tagged
虽然,建议避免将列表用作数据框中的单元格值。
DataFrame.loc可以使用标签列表或布尔数组来访问行和列。上面的列表推导构造了一个布尔数组。
推荐阅读
- unicode - 如何在 Windows 上使用笔记本电脑键盘打字?
- ruby-on-rails - #update 的 RSPEC 测试无法更新某些参数
- mysql - 两个表之间的条件语句
- android - Android - 这不能改变 ActionBar 中搜索图标的颜色吗?
- sql - 如何在 Sqlserver 中加入 3 个表
- node.js - 如何在一行 shell 命令中运行几个 npm 脚本?
- python - 在画布上定位标签
- swift - 如何使用 SwiftUI 以编程方式转换视图?
- c# - 无法使用 ID、XPath 和 CSS 选择器定位元素
- ios - iOS 13 firebase 不工作“请求超时”