#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 таким образом, я бы посоветовал вам также передать его в качестве параметра для вашей функции, чтобы избежать неприятных побочных эффектов позже