Я следую предложенным здесь пандам создать новый столбец на основе значений из других столбцов , но все равно получаю ошибку.По сути, мой фрейм данных Pandas имеет много столбцов, и я хочу сгруппировать фрейм данных на основе нового категориального столбца, значение которого зависит от двух существующих столбцов (AMP, Time).
df
df['Time'] = pd.to_datetime(df['Time'])
#making sure Time column read from the csv file is time object
import datetime as dt
day_1 = dt.date.today()
day_2 = dt.date.today() - dt.timedelta(days = 1)
def f(row):
if (row['AMP'] > 100) & (row['Time'] > day_1):
val = 'new_positives'
elif (row['AMP'] > 100) & (day_2 <= row['Time'] <= day_1):
val = 'rec_positives'
elif (row['AMP'] > 100 & row['Time'] < day_2):
val = 'old_positives'
else:
val = 'old_negatives'
return val
df['GRP'] = df.apply(f, axis=1) #this gives the following error:
TypeError: ("Cannot compare type 'Timestamp' with type 'date'", 'occurred at index 0')
df[(df['AMP'] > 100) & (df['Time'] > day_1)] #this works fine
df[(df['AMP'] > 100) & (day_2 <= df['Time'] <= day_1)] #this works fine
df[(df['AMP'] > 100) & (df['Time'] < day_2)] #this works fine
#df = df.groupby('GRP')
Я могу выбрать правильные субкадры на основе условий, указанных выше, но когда я применяю вышеуказанную функцию к каждой строке, я получаю ошибку.Как правильно подходить к группировке данных на основе перечисленных условий?
РЕДАКТИРОВАТЬ:
К сожалению, я не могу предоставить образец моего кадра данных.Тем не менее, вот простой фрейм данных, который дает ошибку того же типа:
import numpy as np
import pandas as pd
mydf = pd.DataFrame({'a':np.arange(10),
'b':np.random.rand(10)})
def f1(row):
if row['a'] < 5 & row['b'] < 0.5:
value = 'less'
elif row['a'] < 5 & row['b'] > 0.5:
value = 'more'
else:
value = 'same'
return value
mydf['GRP'] = mydf.apply(f1, axis=1)
ypeError: ("unsupported operand type(s) for &: 'int' and 'float'", 'occurred at index 0')
РЕДАКТИРОВАТЬ 2: Как предложено ниже, заключив оператор сравнения в круглые скобки, добился цели в готовом примере.Эта проблема решена.
Тем не менее, я все еще получаю ту же ошибку в моем реальном примере.Кстати, если бы мне пришлось использовать столбец «AMP» с, возможно, другим столбцом в моей таблице, то все работает, и я могу создать df ['GRP'], применив функцию f к каждой строке.Это показывает, что проблема связана с использованием df ['Time'].Но тогда почему я могу выбрать df [(df ['AMP']> 100) & (df ['Time']> day_1)]?Почему это работает в этом контексте, а не когда условие появляется в функции?