如何根据给定标准填写一些字段?

时间:2015-10-16 15:28:40

标签: python pandas

df:
NEW  COL1  COL2
1    2     9
3    NaN   NaN
0    7     NaN

column_names = [COL1,COL2]

我想将TOTAL的值设置为等于NEW,仅当NEW> 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 个答案:

答案 0 :(得分: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如果条件为真,则返回Col1的值,否则返回NEW的值。所以这只会在满足条件的情况下返回NEW值(这实际上与您的要求相反)。

the documentations -

中对此进行了解释
  

<强> Series.where(cond, other=nan, inplace=False, axis=None, level=None, try_cast=False, raise_on_error=True)

     

返回一个与self相同形状的对象,其对应的条目来自self,其中cond为True,否则来自其他。

所以你想要做的就是否定你现在正在做的事情。示例 -

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']