我一直在疯狂地试图解决这个问题。我试图避免使用 df.iterrows() 遍历数据帧的行,因为它非常耗时,而且 .loc() 比我所看到的更好。
我知道这有效:
df = df.loc[df.number == 3, :]
这基本上会将 df 设置为“数字”列等于 3 的每一行。
但是,当我尝试这样的操作时出现错误:
df = df.loc[someFunction(df.number), :]
我想要的是在将所述行的“数字”值设置为参数时获取 someFunction() 返回 True 的每一行。
出于某种原因,它传递了整个列(在此示例中为数据框的整个“数字”列),而不是像前一个示例一样遍历行时的行值。
再说一次,我知道我可以只使用 for 循环和 .iterrows(),但我正在处理大约 280,000 行,而且花费的时间比我想要的要长。还尝试使用 lambda 函数等。
答案 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)
我能想到的两个选项:
使用 pandas apply()
方法和根据 someFunction()
返回 true 或 false 的 lambda 函数创建一个新列。然后,使用 loc
过滤您刚刚创建的新列。
使用 for 循环和 df.itertuples()
,因为它比 iterrows
快得多。请务必查阅文档,因为 itertuples
答案 4 :(得分:0)
只要使用这样的东西就可以了
sg-857778f1