2015-10-16 40 views
2
df: 
NEW COL1 COL2 
1 2  9 
3 NaN NaN 
0 7  NaN 

column_names = [COL1,COL2] 

我想設置TOTAL的值等於新的,只有當新的> 0且連續總和超過COL1 COL2和等於0如何根據給定的標準填寫一些字段?

這是我要做的事,但結果不正確(即COL1在相應的行中等於0)。例如,在第二行COL1將需要等於3,但它是等於0

df[column_names] = df[column_names].fillna(0) 
df.COL1.where((df.NEW>0 & (df[column_names].sum(axis=1) == 0)),df.NEW) 

回答

1

您可以使用DataFrame.applyaxis=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']

+0

我很感謝您是否也可以解釋我的「where」聲明中出現了什麼問題。謝謝 –

+0

有一件事。我不需要創建一個新的列Total。我想把這個值放在COL1中。 –

+1

@KlausosKlausos你說你想要'TOTAL'。從問題引用 - *我希望將TOTAL的值設置爲等於NEW,僅當NEW> 0並且COL1和COL2在一行中的總和等於0時*。如果你想要'COL1'類似的行爲,使用'COL1'而不是'TOTAL'。 –

相關問題