I have a dataframe that looks something like this.
Date | Hour
--------------------------
11/06/2020 | 13
17/06/2020 | 12
02/07/2020 | 9
I wanna check if the Date exists where the Hour is also below 10. Below is my code, but it was wrong.
if((dataFrame['Hour'] < 10).any() & (dataFrame['Date'] == date).any()):
point = 1
Kindly need some helps from you guys. Thanks in advance!
CodePudding user response:
I would use isinstance as follows:
df = pd.DataFrame({'Date':[datetime.datetime(2020, 6, 11), datetime.datetime(2020, 6, 17), datetime.datetime(2020, 7, 2), datetime.datetime(2020, 7, 12), 0],
'Hour':[13, 12, 9, 5, 3]})
df.loc[df.Hour < 10, 'Date'].apply(lambda x: isinstance(x, datetime.datetime))
df:
| Date | Hour | |
|---|---|---|
| 0 | 2020-06-11 00:00:00 | 13 |
| 1 | 2020-06-17 00:00:00 | 12 |
| 2 | 2020-07-02 00:00:00 | 9 |
| 3 | 2020-07-12 00:00:00 | 5 |
| 4 | 0 | 3 |
Result:
2 True
3 True
4 False
Name: Date, dtype: bool
Issues:
If the only non-datetime values in column "Date" are of type None as in the case of None and np.nan, pandas will assume the entire column is type datetime and this method will not work as intended. To solves this problem replace None values with 0.
Solution:
df.loc[df.Hour < 10, 'Date'].replace(np.nan, 0).apply(lambda x: isinstance(x, datetime.datetime))
CodePudding user response:
You can filter a Data Frame with multiple conditions with & and | operators, or use the query() method, then check the length of the resulting Data Frame for the number of matching rows.
Method 1: Using & operator
import pandas as pd
dataFrame = pd.DataFrame({
'Date': ['11/06/2020', '17/06/2020', '02/07/2020'],
'Hour': [13, 12, 9]
})
date = '02/07/2020' # target date to match
if len(dataFrame[(dataFrame['Hour'] < 10) & (dataFrame['Date'] == date)]) != 0:
# at least one row in dataframe matches both conditions
point = 1
else:
point = 0
Method 2: Using query() method.
results = dataFrame.query(f"Hour < 10 and Date == '{date}'")
if len(results) != 0:
print("match")
