理解pandas中的行迭代(python)

时间:2015-12-09 14:37:42

标签: python pandas iterator ambiguous

我有一个数据框(在这个例子中)有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'

问题:每次收到消息"系列的真值都不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。"

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

现在,我的问题: 为什么python没有在行基础上检查if语句(当然在for-loop中)并且保持它给我"系列的真值是模棱两可的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。" -Error

问题的其他表述:为什么python在"对于我在df.iterrows():"仍在整个数据帧级执行if语句,而不是逐行执行。

因为在下面的代码中打印出for循环在行中' 0'所以我认为python会在行' 0'上执行if语句。但它没有检查此行的if语句,因为它给了我"不明确的thruth值错误" ...

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

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

2 个答案:

答案 0 :(得分:1)

这取决于pandas如何在可能的情况下对操作进行矢量化。

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

本身会返回一个系列。这个系列是你寻找的专栏:

>>> 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返回一个系列。对于每一行,该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返回一个布尔值,而不是一个系列。

答案 1 :(得分:0)

怎么样:

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