I have the following table of boolean values:
df = pd.DataFrame(data={'val1': [True, False, False, True], 'val2': [False, True, False, True], 'val3': [True, True, False, True], 'val4': [True, False, True, False], 'val5': [True, True, False, False], 'val6': [False, False, True, True]}, index=pd.Series([1, 2, 3, 4], name='index'))
index | val1 | val2 | val3 | val4 | val5 | val6 |
---|---|---|---|---|---|---|
1 | True | False | True | True | True | False |
2 | False | True | True | False | True | False |
3 | False | False | False | True | False | True |
4 | True | True | True | False | False | True |
I also have the following dictionary:
dict = {'val1': ['val2', 'val3'], 'val4': ['val5', 'val6']}
How do I change the table so for every key column in dict
, if that row has a True
value, the value columns turn to False
?
index | val1 | val2 | val3 | val4 | val5 | val6 |
---|---|---|---|---|---|---|
1 | True | False | False | True | False | False |
2 | False | True | True | False | True | False |
3 | False | False | False | True | False | False |
4 | True | False | False | False | False | True |
For example, since val1
is True
at index 1, val2
and val3
turned to False
I’m doing something like this:
for k, v in dict.items(): if df[k] == True: df[v] = False
but I get the following error:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
Advertisement
Answer
You can’t use if
with Series, which is only meant for scalar boolean check. Use conditional update with boolean indexing instead:
for k, v in dict.items(): df.loc[df[k], v] = False # update columns v where df[k] is True df val1 val2 val3 val4 val5 val6 index 1 True False False True False False 2 False True True False True False 3 False False False True False False 4 True False False False False True