您可以使用DataFrame.apply
與axis=1
(應用FUNC每一行),並在該函數做你的邏輯。示例 -
df['TOTAL'] = df.apply((lambda row: row[col_names].sum() or row['NEW']), axis=1)
演示 -
In [12]: df
Out[12]:
NEW COL1 COL2
0 1 2 9
1 3 NaN NaN
2 0 7 NaN
In [13]: df['TOTAL'] = df.apply((lambda row: row[col_names].sum() or row['NEW']), axis=1)
In [14]: df
Out[14]:
NEW COL1 COL2 Total
0 1 2 9 11
1 3 NaN NaN 3
2 0 7 NaN 7
問題與Series.where
方法是Series.where
如果條件爲true,則返回從Col1
值,否則從NEW
返回值。所以這隻會在條件滿足的情況下返回NEW
的值(這實際上與您的要求相反)。
這在the documentations -
Series.where(cond, other=nan, inplace=False, axis=None, level=None, try_cast=False, raise_on_error=True)
返回相同的形狀自的目的解釋,並且其對應的條目是從自其中cond是真,否則來自其他。
所以你想要做的是否定你現在正在做的事情。示例 -
In [22]: df.COL1.where((df.NEW>0 & (df[column_names].sum(axis=1) == 0)),df.NEW)
Out[22]:
0 2
1 NaN
2 0
Name: COL1, dtype: float64
In [23]: df.COL1.where(~(df.NEW>0 & (df[column_names].sum(axis=1) == 0)),df.NEW)
Out[23]:
0 1
1 3
2 7
Name: COL1, dtype: float64
另外請注意df.COL1
回報的新系列,它不是就地,您可能要分配回df['COL1']
。
我很感謝您是否也可以解釋我的「where」聲明中出現了什麼問題。謝謝 –
有一件事。我不需要創建一個新的列Total。我想把這個值放在COL1中。 –
@KlausosKlausos你說你想要'TOTAL'。從問題引用 - *我希望將TOTAL的值設置爲等於NEW,僅當NEW> 0並且COL1和COL2在一行中的總和等於0時*。如果你想要'COL1'類似的行爲,使用'COL1'而不是'TOTAL'。 –