[英]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.