Синтаксис 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

0 ответов

Другие вопросы по тегам