了解 pandas (python) 中的行迭代

Understanding row iteration in pandas (python)

我有一个数据框(在这个例子中)有 2 行,数据框看起来有点像这样:

PERON   START   END
AB     100      120
CC     110      115

(我想要的,但这不是我的问题,是如果 "START"-'END' 相等,则为每一行创建一个带有标志 的新列到 20)(我在其他用例中也有类似的问题)

(我试过了

df['New']= df.apply(lambda x: 1 if abs(df.START-df.END)==20 else 0

我也试过:

 for i in df.iterrows():
    print i[0]
    if abs(df.START-df.END)==20:
        print 'Legit to make be a flag'

问题:每次收到消息"The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."

我知道如果你不遍历每一行 python 不知道要比较哪个值 "if-statement",因此你可以使用 a.any() 如果你想如果至少有 1 行确实满足 if 语句的条件,则给出一个标志。 a.all() 如果所有行都应符合行条件...

现在,我的问题: 为什么 python 不基于行检查 if 语句(当然是在 for 循环中)并一直给我 "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."-Error

问题的其他表述: 为什么 "for i in df.iterrows():" 中的 python 仍在整个数据帧级别而不是行上执行 if 语句-按行计算。

因为在下面的代码中它打印出 for 循环在行 '0' 中,所以我假设 python 会在行 '0' 上执行 if 语句。但它不检查这一行的 if 语句,因为它给了我 "Ambiguous thruth value error"...

for i in df.iterrows():
    print i[0]

我查看了 "using-if-truth-statements-with-pandas"-文档和其他一些 Whosebug 问题,但我无法弄清楚我哪里出错了(很可能是因为我还在 python-noob -阶段)。

怎么样:

df.loc[:,'Flag'] = abs(df.START-df.END)==20

这取决于 pandas 如何尽可能地向量化操作。

abs(df.START-df.END) ==20

本身returns一个系列。本系列就是您要找的栏目:

>>> df = pd.DataFrame([[100,120],[110,115]],index=['AB','CC'],columns=['START','END'])
... df
... abs(df.START-df.END)==20
13: AB     True
CC    False
dtype: bool

观察:

>>> df['New'] = abs(df.START-df.END)==20
>>> df
15:     START  END    New
AB    100  120   True
CC    110  115  False

pandas就是为这种操作而设计的

你不应该灰心,因为你的两次尝试都非常接近:

df['New']= df.apply(lambda x: 1 if abs(df.START-df.END)==20 else 0)

坏了,因为 abs(df.START-df.END)==20 returns 一个系列。对于每一行,lambda 都在询问 Series 是否为 True,因此会出现错误。

如果相反,您有:

df['New']= df.apply(lambda x: 1 if abs(x.START-x.END)==20 else 0, axis =1)

这会产生预期的结果,因为 abs(x.START-x.END)==20 returns 一个布尔值,而不是一个系列。