我有一个数据框(在这个例子中)有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阶段。
答案 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