了解 pandas (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'
问题:每次收到消息"The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."
我知道如果你不遍历每一行 python 不知道要比较哪个值 "if-statement",因此你可以使用 a.any() 如果你想如果至少有 1 行确实满足 if 语句的条件,则给出一个标志。
a.all() 如果所有行都应符合行条件...
现在,我的问题:
为什么 python 不基于行检查 if 语句(当然是在 for 循环中)并一直给我 "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."-Error
问题的其他表述: 为什么 "for i in df.iterrows():" 中的 python 仍在整个数据帧级别而不是行上执行 if 语句-按行计算。
因为在下面的代码中它打印出 for 循环在行 '0' 中,所以我假设 python 会在行 '0' 上执行 if 语句。但它不检查这一行的 if 语句,因为它给了我 "Ambiguous thruth value error"...
for i in df.iterrows():
print i[0]
我查看了 "using-if-truth-statements-with-pandas"-文档和其他一些 Whosebug 问题,但我无法弄清楚我哪里出错了(很可能是因为我还在 python-noob -阶段)。
怎么样:
df.loc[:,'Flag'] = abs(df.START-df.END)==20
这取决于 pandas 如何尽可能地向量化操作。
abs(df.START-df.END) ==20
本身returns一个系列。本系列就是您要找的栏目:
>>> 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 returns 一个系列。对于每一行,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 returns 一个布尔值,而不是一个系列。
我有一个数据框(在这个例子中)有 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'
问题:每次收到消息"The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."
我知道如果你不遍历每一行 python 不知道要比较哪个值 "if-statement",因此你可以使用 a.any() 如果你想如果至少有 1 行确实满足 if 语句的条件,则给出一个标志。 a.all() 如果所有行都应符合行条件...
现在,我的问题: 为什么 python 不基于行检查 if 语句(当然是在 for 循环中)并一直给我 "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."-Error
问题的其他表述: 为什么 "for i in df.iterrows():" 中的 python 仍在整个数据帧级别而不是行上执行 if 语句-按行计算。
因为在下面的代码中它打印出 for 循环在行 '0' 中,所以我假设 python 会在行 '0' 上执行 if 语句。但它不检查这一行的 if 语句,因为它给了我 "Ambiguous thruth value error"...
for i in df.iterrows():
print i[0]
我查看了 "using-if-truth-statements-with-pandas"-文档和其他一些 Whosebug 问题,但我无法弄清楚我哪里出错了(很可能是因为我还在 python-noob -阶段)。
怎么样:
df.loc[:,'Flag'] = abs(df.START-df.END)==20
这取决于 pandas 如何尽可能地向量化操作。
abs(df.START-df.END) ==20
本身returns一个系列。本系列就是您要找的栏目:
>>> 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 returns 一个系列。对于每一行,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 returns 一个布尔值,而不是一个系列。