如何为熊猫使用多个if条件?

时间:2019-02-01 22:51:32

标签: python pandas

我想在我的熊猫使用多个条件,但我收到以下错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, 
a.bool(), a.item(), a.any() or a.all().

按照此thread,我用按位运算符替换了and,但仍然出现错误。

import pandas as pd

d1 = {'Year': [2019,2019,2019,2019,2019], 'Week':[1,2,4,6,7], 'Value': 
[20,40,60,75,90]}

df1 = pd.DataFrame(data=d1)

if (df1['Year'] == df1['Year'].shift(-1)) & \
 (df1['Week'] == df1['Week'].shift(-1)):
    print('Yes')
else:
    print('No')

在这里我可能做错了什么?

3 个答案:

答案 0 :(得分:3)

实际的比较检查并不正确,但不适用于常规Python if,因为Pandas以矢量化方式工作。正如我在有关错误的评论中所说:

  

Python应该对if [1, 2, 3] and [2, 3, 4]:说些什么?那将是True   但它不会告诉您有关单个行的任何信息(   列表)

使用np.where

df1['comparison'] = np.where((df1['Year'] == df1['Year'].shift(-1)) & 
                             (df1['Week'] == df1['Week'].shift(-1)), 'Yes', 'No')

答案 1 :(得分:3)

您可以使用np.where,它会根据条件是否满足产生YesNo

c1 = df1.Year == df1.Year.shift(-1)
c2 = df1.Week == df1.Week.shift(-1)
df1.loc[:,'is_repeated'] = np.where(c1&c2, 'Yes', 'No')

   Year  Week  Value    is_repeated
0  2019     1     20          No
1  2019     2     40          No
2  2019     4     60          No
3  2019     6     75          No
4  2019     7     90          No

答案 2 :(得分:0)

我对按位运算符不是很确定,但是要比较数组,可以一起使用equals方法和逻辑and,我认为这样会更容易。

例如,您可以将循环条件修改为:

if df1['Year'].equals(df1['Year'].shift(-1)) and df1['Week'].equals(df1['Week'].shift(-1)):