Reputation: 1992
I have a pandas dataframe and I want to filter the whole df based on the value of two columns in the data frame. I want to get back all rows and columns where IBRD or IMF != 0.
alldata_balance = alldata[(alldata[IBRD] !=0) or (alldata[IMF] !=0)]
but this gives me a ValueError
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
So I know I am not using the or statement correctly, is there a way to do this?
Upvotes: 144
Views: 344213
Reputation: 49
#like this
df1 = df[(df['age'] > 25) | (df['gender'] == "Male")]
Upvotes: 4
Reputation: 7832
From the docs:
Another common operation is the use of boolean vectors to filter the data. The operators are: | for or, & for and, and ~ for not. These must be grouped by using parentheses.
https://pandas.pydata.org/docs/user_guide/indexing.html#boolean-indexing
Try:
alldata_balance = alldata[(alldata[IBRD] !=0) | (alldata[IMF] !=0)]
Upvotes: 237
Reputation:
Just wanted to note that you can use both of or
and |
inside the query
method:
alldata.query('IBRD!=0 or IMF!=0')
and
alldata.query('IBRD!=0 | IMF!=0')
both produce the same outcome.
Upvotes: 4
Reputation: 59
You can do like below to achieve your result:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
....
....
#use filter with plot
#or
fg=sns.factorplot('Retailer country', data=df1[(df1['Retailer country']=='United States') | (df1['Retailer country']=='France')], kind='count')
fg.set_xlabels('Retailer country')
plt.show()
#also
#and
fg=sns.factorplot('Retailer country', data=df1[(df1['Retailer country']=='United States') & (df1['Year']=='2013')], kind='count')
fg.set_xlabels('Retailer country')
plt.show()
Upvotes: 5