繁体   English   中英

了解熊猫中的行迭代(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'

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

我了解,如果您不遍历每一行,python都不知道将哪个值与“ if-statement”进行比较,因此,如果您希望在至少一行满足条件的情况下给出一个标志,则使用a.any() if语句的条件。 a.all()如果所有行都应匹配行条件...

现在,我的问题是 :为什么python为什么不检查基于行的if语句(肯定在for循环中),并保持它的状态为“系列的真值不明确?请使用a.empty,a.bool (),a.item(),a.any()或a.all()。”-错误

问题的其他提法:为什么python在df.iterrows()中的for for python中仍然在整个数据帧级别执行if语句,而不是逐行执行。

因为在下面的代码中打印出for循环位于行“ 0”中,所以我假设python将对行“ 0”执行if语句。 但是它不检查该行的if语句,因为它给我“歧义阈值错误” ...

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

我已经看过“使用真假陈述与熊猫”文档和其他一些stackoverflow问题,但是我无法弄清楚哪里出了问题(很可能是因为我仍然在python-noob-相)。

这取决于熊猫如何在可能的地方对操作进行矢量化处理。

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

怎么样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM