理解pandas(python)中的行迭代

理解pandas(python)中的行迭代,python,pandas,iterator,ambiguous,Python,Pandas,Iterator,Ambiguous,我有一个数据框(在本例中)有2行,数据框看起来有点像这样: PERON START END AB 100 120 CC 110 115 (我想要的,但这不是我的问题,是如果“开始”-“结束”等于20,则为每一行创建一个带有标志)的新列(我在其他用例中也有类似的问题) (我试过了 我还尝试: for i in df.iterrows(): print i[0] if abs(df.START-df.END)==20:

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

PERON   START   END
AB     100      120
CC     110      115
(我想要的,但这不是我的问题,是如果“开始”-“结束”等于20,则为每一行创建一个带有标志)的新列(我在其他用例中也有类似的问题)

(我试过了

我还尝试:

 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语句”与哪个值进行比较,因此,如果至少有一行满足if语句的条件,则需要使用.any()来给出一个标志。 a、 all()如果所有行都应与行条件匹配

现在,我的问题是: 为什么python不在行的基础上检查if语句(当然是在for循环中),并让它给出“序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()”-错误

问题的其他表述:为什么“for i in df.iterrows():”中的python仍然在整个数据帧级别上执行if语句,而不是逐行执行

因为在下面的代码中,它打印出for循环位于行“0”中,所以我假设python将在行“0”上执行if语句。但是它不会检查此行的if语句,因为它给了我“不明确的thruth值错误”

我已经看过了“在熊猫身上使用if-truth语句”——文档和其他一些stackoverflow问题,但我不知道哪里出了错(很可能是因为我仍处于python noob阶段)。

怎么样:

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

这取决于熊猫如何尽可能地将操作矢量化

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
熊猫是为这种操作而设计的

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

df['New']= df.apply(lambda x: 1 if abs(df.START-df.END)==20 else 0)
因为abs(df.START df.END)==20返回一个序列。对于每一行,lambda询问序列是否为真,因此出错

如果相反,您有:

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

这将产生所需的结果,因为abs(x.START-x.END)==20返回一个布尔值,而不是一个序列。

如果df.START-df.END等于20,是否需要一个带有布尔值(True或False)的新列?这是问题吗?问题主要是为什么在“df.START行后接if语句”中为什么if语句仍然在整个数据帧级别上执行,因为这就是您所写的。(如果abs(df.START df.END)==20:)中没有i,谢谢,就是这样(我问题的答案)。我必须做“如果abs(df.ix[i[0],'START'-df.ix[i[0],'END'))。我显然倾向于不在if语句中使用“I”!现在我会(尝试)记住每次都不要忘记“I”…谢谢这是我想要的国旗,但我的问题更多的是关于df.iterrows()以及为什么它不在行的基础上执行if语句。很抱歉我的问题表述得不好…但再次感谢…>>>为什么python在df.iterrows()中的“for i”中:“仍然在整个数据帧级别上执行if语句,而不是逐行执行。因为if语句中有df,而不是i!只要有可能,就利用pandas的矢量化。很少需要使用.apply()或.iterrows()谢谢,非常清楚的回答和系列返回的解释。它帮助我理解了这类操作的基本工作原理(我想知道…)
df['New']= df.apply(lambda x: 1 if abs(df.START-df.END)==20 else 0)
df['New']= df.apply(lambda x: 1 if abs(x.START-x.END)==20 else 0, axis =1)