【问题标题】:df.loc[] with multiple callables具有多个可调用对象的 df.loc[]
【发布时间】:2019-04-29 16:09:12
【问题描述】:

我想使用两个单独的 Callables(一个由用户提供,一个由参数提供)在 DataFrame 中进行查找。也可以接受:使用显式语法按一个 Callable 和另一个过滤器进行索引。

这可能吗?我猜它可以用 groupby 来完成,但这似乎有点麻烦。

最小代码示例:

import pandas as pd  # Version: 0.23.4, Python 2.7
df = pd.DataFrame({'C1': [1, 2,1], 'C2': [3, 4, 10]})


# This works
filter = lambda adf: adf['C1']==1
df.loc[filter]

# So does this
df.loc[df['C2']>5]

# Both of them together works
df.loc[(df['C2']>5) & (df['C1']==1)]

# So why don't any of these?
df.loc[(df['C2']>5) & filter] #TypeError: ...
df.loc[(df['C2']>5) & (filter)] # TypeError: ...
df.loc[df['C2']>5 & filter] # TypeError: ...

filter2 = lambda adf: adf['C2']>5
df.loc[(filter) & (filter2)] # TypeError: ...
df.loc[(filter) | (filter2)] # TypeError: ...

# Nesting works, but isn't pretty for multiple callables
df.loc[(df['C2']>5)].loc[filter]

【问题讨论】:

  • 过滤器是一个函数。您需要通过filter(df) 调用它:尝试df.loc[(df['C2']>5) & (filter(df))]
  • 谢谢@Chris!这在 filter(df) == df.loc[filter] 的假设下有效。我还没有弄清楚这是否总是正确的。
  • @MagO 错误不是由您的索引方式引起的,而是由按位与运算引起的。 @Chris 建议创建一个布尔掩码以避免 TypeError
  • @MagO 另一个选项是创建一个包含可调用对象:df.loc[lambda x: filter(x) & (x['C2'] > 5)],它使用之前创建的可调用对象

标签: python pandas pandas-groupby


【解决方案1】:

当您将 lambda filter 作为 loc 参数传递时,您将其作为对象函数传递,而不是作为该函数计算的结果。

因此,您不能使用任何logical operator 来组合多个功能,这与使用多个logical 条件时发生的情况不同。

无论如何,如果您想使用异构标准(逻辑和功能)来过滤您的数据框,您可以使用 loc 两次。正如你自己建议的那样。

# function
filter = lambda df: df['C1']==1
df.loc[(df['C2']>5)].loc[filter]

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 2014-12-27
    • 2016-04-02
    • 2014-02-13
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多