有没有办法在 Pandas 中使用方法/函数作为 .loc() 的表达式?

时间:2021-07-24 22:08:22

标签: python python-3.x pandas dataframe

我一直在疯狂地试图解决这个问题。我试图避免使用 df.iterrows() 遍历数据帧的行,因为它非常耗时,而且 .loc() 比我所看到的更好。

我知道这有效:

df = df.loc[df.number == 3, :]

这基本上会将 df 设置为“数字”列等于 3 的每一行。

但是,当我尝试这样的操作时出现错误:

df = df.loc[someFunction(df.number), :]

我想要的是在将所述行的“数字”值设置为参数时获取 someFunction() 返回 True 的每一行。

出于某种原因,它传递了整个列(在此示例中为数据框的整个“数字”列),而不是像前一个示例一样遍历行时的行值。

再说一次,我知道我可以只使用 for 循环和 .iterrows(),但我正在处理大约 280,000 行,而且花费的时间比我想要的要长。还尝试使用 lambda 函数等。

5 个答案:

答案 0 :(得分:2)

Apply 很慢 - 如果可以,请尝试将复杂的向量化逻辑放入函数中,将系列作为参数:

import pandas as pd

df = pd.DataFrame()
df['a'] = [7, 6, 5, 4, 3, 2]
df['b'] = [1, 2, 3, 4, 5, 6]

def my_func(series1, series2):
  return (series2 > 3) | (series1 == series2)

df.loc[my_func(df.b, df.a), 'new_column_name'] = True

答案 1 :(得分:1)

我认为这就是您所需要的:

import pandas as pd


df = pd.DataFrame({"number": [x for x in range(10)]})


def someFunction(row):
    if row > 5:
        return True
    else:
        return False


df = df.loc[df.number.apply(someFunction)]
print(df)

输出:

   number
6       6
7       7
8       8
9       9

答案 2 :(得分:1)

您可以在 .loc 中使用匿名函数 x 指的是您正在索引的数据框

df.loc[lambda x: x.number > 5, :]

答案 3 :(得分:0)

我能想到的两个选项:

  1. 使用 pandas apply() 方法和根据 someFunction() 返回 true 或 false 的 lambda 函数创建一个新列。然后,使用 loc 过滤您刚刚创建的新列。

  2. 使用 for 循环和 df.itertuples(),因为它比 iterrows 快得多。请务必查阅文档,因为 itertuples

    的语法略有不同

答案 4 :(得分:0)

只要使用这样的东西就可以了

sg-857778f1