Python 如何修复';ValueError:数据帧的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all();何时?;使用

Python 如何修复';ValueError:数据帧的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all();何时?;使用,python,pandas,valueerror,Python,Pandas,Valueerror,我想根据多列条件重新分配值,但出现ValueError。我用&代替了和,这通常是解决此类错误的答案。我的目标和准则如下: ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 如果CountryBorn==Canada和YearsInCanada==None df Age CountryBorn YearsInCan

我想根据多列条件重新分配值,但出现
ValueError
。我用
&
代替了
,这通常是解决此类错误的答案。我的目标和准则如下:

ValueError: The truth value of a DataFrame is ambiguous. 
Use a.empty, a.bool(), a.item(), a.any() or a.all().
如果
CountryBorn==Canada
YearsInCanada==None

df
Age    CountryBorn    YearsInCanada
87     NaN            77      
67     Canada         67
29     US             7
26     US             10
22     US             12
35     Canada         NaN
45     Canada         NaN

expected output
Age    CountryBorn    YearsInCanada
87     NaN            77      
67     Canada         67
29     US             7
26     US             10
22     US             12
35     Canada         35
45     Canada         45
我的以下代码显示了
ValueError

    if df.loc[(df['YearsInCanada'] == None) & (df['CountryBorn'] == 'Canada')]:
        df['YearsInCanada'] == df['Age']

    else:
        df['YearsInCanada'] == df['YearsInCanada']
谢谢

这将返回一个(dervied)数据帧<代码>如果需要布尔表达式

如果您试图进行矢量化赋值,则必须将其编码为Pandas action+筛选器,而不是Python
If

这将返回一个(dervied)数据帧<代码>如果需要布尔表达式

如果您试图进行矢量化分配,则必须使用以下方法将其编码为Pandas action+筛选器,而不是Python
If

解决方案:

解决方案使用:


为什么最后一个值是35?不是应该是45吗?@anky_91谢谢你指出,是个打字错误。为什么最后一个值是35?“应该是45吗?”@anky_91谢谢你指出,一个打字错误。
df.loc[(df['YearsInCanada'] == None) & (df['CountryBorn'] == 'Canada')]
df.YearsInCanada=np.where((df['YearsInCanada'].isna()) & (df['CountryBorn'] == 'Canada'),\
                      df.YearsInCanada.fillna(df.Age),df.YearsInCanada)
print(df)

   Age CountryBorn  YearsInCanada
0   87         NaN           77.0
1   67      Canada           67.0
2   29          US            7.0
3   26          US           10.0
4   22          US           12.0
5   35      Canada           35.0
6   45      Canada           45.0