首页 > 解决方案 > 熊猫 if else 仅在特定行上

问题描述

我有一个熊猫数据框,如下所示。我想申请以下条件

仅对于 A = 2 的行,将列“C”、“D”更新为 -99。

我有一个像下面这样的函数,它将 C 和 D 的值更新为 -99。

def func(df):
    for col in df.columns:
        if ("C" in col) or ("D" in col):
            df.loc[:,col] = -99

现在我只想调用该函数,如果 A = 2。我尝试了下面的代码,但它将 C 和 D 的所有行更新为 -99

import pandas as pd
import math
import sys
import re
data=[[0,1,0,0, 0],
      [1,2,0,0,0],
      [2,0,0,0,0],
      [2,4,0,0,0],
      [1,8,0,0,0],
      [3,2, 0,0,0]]

df = pd.DataFrame(data,columns=['A','B','C', 'D','E'])
df
def func(df):
    for col in df.columns:
        if ("C" in col) or ("D" in col):
            df.loc[:,col] = -99

if (df['A'] == 2).any():
    func(df)
    print(df)

我的预期输出:

   A  B   C   D  E
0  0  1  0   0  0
1  1  2  0   0  0
2  2  0 -99 -99  0
3  2  4 -99 -99  0
4  1  8  0   0  0
5  3  2  0   0  0

标签: python-3.xpandas

解决方案


您可以通过过滤来做到这一点:

df.loc[df['A'] == 2, ['C', 'D']] = -99

这里过滤的第一项过滤行,我们过滤这些行,以便我们只选择列的值为 的'A'2C我们通过名称列表(和D)过滤列。然后我们分配-99给这些项目。

对于给定的样本数据,我们得到:

>>> df = pd.DataFrame(data,columns=['A','B','C', 'D','E'])
>>> df
   A  B  C  D  E
0  0  1  0  0  0
1  1  2  0  0  0
2  2  0  0  0  0
3  2  4  0  0  0
4  1  8  0  0  0
5  3  2  0  0  0
>>> df.loc[df['A'] == 2, ['C', 'D']] = -99
>>> df
   A  B   C   D  E
0  0  1   0   0  0
1  1  2   0   0  0
2  2  0 -99 -99  0
3  2  4 -99 -99  0
4  1  8   0   0  0
5  3  2   0   0  0

推荐阅读