Создайте новый столбец в pandas с учетом условия

#python #pandas #dataframe

#python #pandas #dataframe

Вопрос:

Я пытаюсь создать новый столбец из условия, идея заключается в том, что если первый столбец имеет значение 0, возьмите второй столбец, а если нет, оставьте первый столбец.

 df1 = pd.DataFrame({
'Buyer': ['Carl', 'Carl', 'Carl'],
'Quantity': [18, 0, 5],
'Hoja':[2,4,8],
'Salida':[0,0,0]})

def remean_points(row):
    if df1.Quantity==0:
        row.Salida = Quantity
    else:
        df1.Salida= row.Hoja
    return row

df1.apply(remean_points, axis='columns')
  

Однако я нахожу следующую ошибку, и я не знаю, как ее решить, я ценю вашу помощь.

 ValueError                                Traceback (most recent call last)
<ipython-input-20-7c3222c7a9a8> in <module>
      6     return row
      7 
----> 8 df1.apply(remean_points, axis='columns')

C:ProgramDataAnaconda3libsite-packagespandascoreframe.py in apply(self, func, axis, raw, result_type, args, **kwds)
   6876             kwds=kwds,
   6877         )
-> 6878         return op.get_result()
   6879 
   6880     def applymap(self, func) -> "DataFrame":

C:ProgramDataAnaconda3libsite-packagespandascoreapply.py in get_result(self)
    184             return self.apply_raw()
    185 
--> 186         return self.apply_standard()
    187 
    188     def apply_empty_result(self):

C:ProgramDataAnaconda3libsite-packagespandascoreapply.py in apply_standard(self)
    294             try:
    295                 result = libreduction.compute_reduction(
--> 296                     values, self.f, axis=self.axis, dummy=dummy, labels=labels
    297                 )
    298             except ValueError as err:

pandas_libsreduction.pyx in pandas._libs.reduction.compute_reduction()

pandas_libsreduction.pyx in pandas._libs.reduction.Reducer.get_result()

<ipython-input-20-7c3222c7a9a8> in remean_points(row)
      1 def remean_points(row):
----> 2     if df1.Quantity==0:
      3         row.Salida = Quantity
      4     else:
      5         df1.Salida= row.Hoja

C:ProgramDataAnaconda3libsite-packagespandascoregeneric.py in __nonzero__(self)
   1477     def __nonzero__(self):
   1478         raise ValueError(
-> 1479             f"The truth value of a {type(self).__name__} is ambiguous. "
   1480             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1481         )

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
  

Ответ №1:

В вашем сообщении об ошибке содержится жалоба на то, что значение истинности ряда неоднозначно, это означает, что у вас есть объект Series, полный логических значений, и if не знает, что с ним делать. Ожидается одно логическое значение.

Это происходит из-за этой строки if df1.Quantity==0: , вы спрашиваете каждое значение столбца, равно ли оно нулю, и именно поэтому у вас есть логический ряд. Я предполагаю, что вы пытаетесь проверить только значение Quantity для этой конкретной строки, полученной функцией, поэтому вам следует изменить df1 для строки.


Если я правильно понял вашу цель, это функция и вызов функции, которые вы хотите:

 df1 = pd.DataFrame({
'Buyer': ['Carl', 'Carl', 'Carl'],
'Quantity': [18, 0, 5],
'Hoja':[2,4,8],
'Salida':[0,0,0]})

def remean_points(row):
    if row.Quantity==0:
        return row.Quantity
    else:
        return row.Hoja


df1["Salida"] = df1.apply(remean_points, axis ="columns")
  

PS: Если вы действительно хотите использовать df1 таким образом, я бы посоветовал вам также передать его в качестве параметра для вашей функции, чтобы избежать неприятных побочных эффектов позже