如何在 pandas 子集中引用自己

How to refer to self in pandas subsetting

当我以临时方式探索数据时,我经常会遇到这样的代码:

X = (adj_all.o.diff(1) / adj_none.o.diff(1)).diff(1)
print(X[X > 0])

有没有办法在一行中轻松完成此操作?以下有效但冗长:

(adj_all.o.diff(1) / adj_none.o.diff(1)).diff(1)[(adj_all.o.diff(1) / adj_none.o.diff(1)).diff(1) > 0]

我想要这样的东西:

(adj_all.o.diff(1) / adj_none.o.diff(1)).diff(1)[self > 0]

请注意,这不是生产代码。这是临时探索的一部分,其中迭代速度对结果很重要,这就是为什么我希望能够在一行中完成这个常见的事情。

您可以使用 pipe:

(adj_all.o.diff(1) / adj_none.o.diff(1)).diff(1).pipe(lambda x: x[x>0])

.loc 的众多用途之一就是这个。您可以向它传递一个 lambda 函数,该函数将数据框作为参数,return 一个掩码作为过滤依据:

(adj_all.o.diff(1) / adj_none.o.diff(1)).diff(1).loc[lambda x:x>0]

你可以尝试 walrus operator 在 Python 3.8

中引入
# Thanks for richardec pointing out list symbol [] is not necessary here
df, res = [(x := (adj_all.o.diff(1) / adj_none.o.diff(1)).diff(1)), x[x>0]]

# or

res = (x := (adj_all.o.diff(1) / adj_none.o.diff(1)).diff(1))[x>0]