作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Pandas 数据框,我想根据两个函数的应用进行子集化 is_long()
和 is_short()
.第一个必须返回 True,第二个必须返回 True 以使行成为子集。例如:
import pandas as pd
data = [['foo', 10], ['baar', 15], ['baz', 14], ['baaar', 15]]
df = pd.DataFrame(data, columns = ['name', 'age'])
df
def is_long(x):
assert isinstance(x, str)
return True if len(x) > 2 else False
def is_short(x):
assert isinstance(x, str)
return True if len(x) < 4 else False
以下应返回
name
的行长度为 3:
df[df['name'].apply(is_long).apply(is_short)]
应该返回:
name age
0 foo 10
2 baz 14
但是第二次应用不会在数据帧上执行,因为它返回一个断言错误:
11
12 def is_short(x):
---> 13 assert isinstance(x, str)
14 return True if len(x) < 4 else False
AssertionError:
我的问题是 - 如何优雅地将两个应用函数链接在一起(无需编写两行单独的代码),以便它们作用于同一列并按顺序执行?
最佳答案
如果你想通过 apply()
来做方法然后
代替:
df[df['name'].apply(is_long).apply(is_short)]
做/使用这个:
df[df.loc[df['name'].apply(is_long),'name'].apply(is_short)]
或
df[df['name'].apply(lambda x: is_long(x) & is_short(x))]
上述方法的输出:
#output
name age
0 foo 10
2 baz 14
说明:
df[df['name'].apply(is_long).apply(is_short)]
df['name'].apply(is_long)
给出
boolean series
的
True
并且您正在将该 bool 系列传递给
is_short()
通过链接另一个函数
apply()
方法,这就是为什么你得到
AssertionError
因为你用过
assert
您的
is_short()
中的关键字功能和您的条件
isinstance(x, str)
不满意
关于python - 如何将应用函数链接到 Pandas 数据帧的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66991065/
我是一名优秀的程序员,十分优秀!