Синтаксис Python3 для объединения выборок столбцов / строк данных и встроенных функций
Как бы вы объединили выбранные строки кадра данных со встроенными функциями в правильном синтаксисе? Ключевое уравнение (с ошибкой) помечено '***' ниже. Существует три аспекта этого уравнения:
(1) Операция выполняется только для выбранных строк [lo:hi] и столбца [ColumnName] кадра данных (2) Просмотрите записи NaN в этом выборе и установите для каждой из них случайное число как определяется (3)
(3) Случайное число определяется библиотечной функцией np.random.randint с диапазоном значений (a) между (avg+std) и (avg-std) с общим размером size=null_total[ColumnName] записи, которые будут созданы.
(b) Затем случайное число делится на avg для нормализации значения. avg и std - это среднее и стандартное отклонение всех значений выбранных строк в [ColumnName], вычисленных встроенными функциями фреймов данных.mean и.std соответственно. avg,std и null_total объявляются как тип Dataframe, хотя они могут быть просто сериями.
def process_Fill_and_Normalize(df,lo,hi,ColumnName):
avg = pd.DataFrame()
std = pd.DataFrame()
null_total = pd.DataFrame()
avg[ColumnName] = df[ColumnName][lo:hi].mean()
std[ColumnName] = df[ColumnName][lo:hi].std()
null_total[ColumnName] = df[ColumnName][lo:hi].isnull().sum()
***df[ColumnName][lo:hi][np.isnan(combined[ColumnName][lo:hi])] =
np.random.randint(avg[ColumnName] - std[ColumnName], avg[ColumnName] +
std[ColumnName], size=null_total[ColumnName])/avg[ColumnName]
return df
Сообщение об ошибке выглядит следующим образом:
ValueError: The truth value of a Series is ambiguous. Use a.empty,
a.bool(), a.item(), a.any() or a.all().
/opt/conda/lib/python3.6/site-packages/pandas/core/generic.py in
__nonzero__(self)
915 raise ValueError("The truth value of a {0} is ambiguous. "
916 "Use a.empty, a.bool(), a.item(), a.any() or
a.all()."
--> 917 .format(self.__class__.__name__))
918
919 __bool__ = __nonzero__
Ваш совет о том, как изменить синтаксис, будет очень признателен.
Большое спасибо за ответ от hpaulj, который советует разбить длинное уравнение. Индексное выражение определяется в отдельном уравнении. Следующий модифицированный код работает:
def process_Fill_and_Normalize(df,lo,hi,ColumnName):
avg = pd.DataFrame()
std = pd.DataFrame()
avg[ColumnName] = df[ColumnName][lo:hi].mean()
std[ColumnName] = df[ColumnName][lo:hi].std()
null_total[ColumnName] = df[ColumnName][lo:hi].isnull().sum()
mull_entry_index = np.isnan(combined[ColumnName][lo:hi])
df[ColumnName][lo:hi][mull_entry_index] =
np.random.randint(avg[ColumnName]
- std[ColumnName], avg[ColumnName] + std[ColumnName],
size=null_total[ColumnName])/avg[ColumnName]
return df