Python 在考虑条件的情况下创建新列

Python 在考虑条件的情况下创建新列,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 els

我试图根据一个条件创建一个新列,其思想是,如果第一列的值为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:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.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:\ProgramData\Anaconda3\lib\site-packages\pandas\core\apply.py in get_result(self)
    184             return self.apply_raw()
    185 
--> 186         return self.apply_standard()
    187 
    188     def apply_empty_result(self):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\apply.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\_libs\reduction.pyx in pandas._libs.reduction.compute_reduction()

pandas\_libs\reduction.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:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.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().
ValueError回溯(最近一次调用)
在里面
6返回行
7.
---->8 df1.应用(重新定义点,轴=列)
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\frame.py在应用中(self、func、axis、raw、result\u type、args、**kwds)
6876科威特第纳尔=科威特第纳尔,
6877         )
->6878返回操作获取结果()
6879
6880 def applymap(self,func)->“数据帧”:
获取结果(self)中的C:\ProgramData\Anaconda3\lib\site packages\pandas\core\apply.py
184返回self.apply_raw()
185
-->186返回自我。应用_标准()
187
188 def应用\空\结果(自身):
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\apply.py在apply\u标准(self)中
294试试:
295结果=libreduce.compute\u reduce(
-->296个值,self.f,轴=self.axis,虚拟=虚拟,标签=标签
297                 )
298除ValueError作为错误外:
熊猫\\u libs\reduce.pyx在熊猫中。_libs.reduce.compute\u reduce()
pandas\\ libs\reduce.pyx在pandas中。\ libs.reduce.Reducer.get\ u result()
在remean_点(世界其他地区)
1个定义点(世界其他地区):
---->2如果df1.数量==0:
3行Salida=数量
4其他:
5 df1.Salida=霍亚区
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\generic.py in\uuuuuuuu nonzero\uuuuuuuuu(self)
1477定义非零(自):
1478升值错误(
->1479F“一个{type(self)。{name}的真值是不明确的。”
1480“使用a.empty、a.bool()、a.item()、a.any()或a.all()
1481         )
ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。

您的错误消息是抱怨序列的真值不明确,这意味着您有一个充满布尔值的序列对象,而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,我建议您也将其作为函数的参数传递,以避免以后出现令人讨厌的副作用