代码之家  ›  专栏  ›  技术社区  ›  Bill Armstrong

根据另一列的条件修改列中的值

  •  1
  • Bill Armstrong  · 技术社区  · 7 年前

    问题:A组如何 df 基于变量,使用 for 循环?

    任务是根据列中的值进行条件计算。但计算常数取决于参考列中的值。给了这个 测向 以下内容:

    In [55]: df = pd.DataFrame({
        ...:     'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'],
        ...:     'col2' : [2, 1, 9, 8, 7, 4],
        ...:     'col3': [0, 1, 9, 4, 2, 3],
        ...: })
    
    In [56]: df
    Out[56]: 
      col1  col2  col3
    0    A     2     0
    1    A     1     1
    2    B     9     9
    3  NaN     8     4
    4    D     7     2
    5    C     4     3
    

    我用过这个方法 here 插入 'math' 从中提取余额的列 col3 加10。但现在我想迭代一个列表,根据中的值设置计算变量。 col1 .结果如下:

    In [57]: items = ['A', 'D']
    
    In [58]: for item in items:
        ...:     df.loc[:, 'math'] = df.loc[df['col1'] == item, 'col3']
        ...:     
    
    In [59]: df
    Out[59]: 
      col1  col2  col3  math
    0    A     2     0   NaN
    1    A     1     1   NaN
    2    B     9     9   NaN
    3  NaN     8     4   NaN
    4    D     7     2   2.0
    5    C     4     3   NaN
    

    显而易见的问题是,df在每次迭代中都被重写了。这个 math 索引0和1的列在第一次迭代时计算出值,但在第二次迭代时会删除这些值。结果 测向 只考虑列表的最后一个元素。

    我可以通过添加代码来迭代每个索引值,但这似乎比蟒蛇更可悲。

    的预期输出 .mul() 例子

    In [100]: df
    Out[100]: 
      col1  col2  col3  math
    0    A     2     0   0.0
    1    A     1     1  10.0
    2    B     9     9   NaN
    3  NaN     8     4   NaN
    4    D     7     2  20.0
    5    C     4     3   NaN
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   cs95 abhishek58g    7 年前

    当前方法的问题是,每个后续迭代的输出都会覆盖之前的输出。因此,您最终只会得到最后一个项目的输出,而没有更多的输出。

    选择包含元素的所有行 items 分配,和以前一样。

    df['math'] = df.loc[df.col1.isin(items), 'col3'] * 10
    

    或者,

    df['math'] = df.query("col1 in @items").col3 * 10
    

    甚至,

    df['math'] = df.col3.where(df.col1.isin(items)) * 10
    

    df
    
      col1  col2  col3  math
    0    A     2     0   0.0
    1    A     1     1  10.0
    2    B     9     9   NaN
    3  NaN     8     4   NaN
    4    D     7     2  20.0
    5    C     4     3   NaN
    
        2
  •  2
  •   BENY    7 年前

    使用assign失败的原因,因为在每个for循环中,都会为您分配一个新值的数学,如下所示,它只显示最后一个值,并在for循环之后呈现给结果。

    0     0.0
    1    10.0
    2     NaN
    3     NaN
    4     NaN
    5     NaN
    Name: col3, dtype: float64
    0     NaN
    1     NaN
    2     NaN
    3     NaN
    4    20.0
    5     NaN
    Name: col3, dtype: float64
    

    你可以用下面的

    df.loc[df.col1.isin(items),'math']=df.col3*10
    df
    Out[85]: 
      col1  col2  col3  math
    0    A     2     0   0.0
    1    A     1     1  10.0
    2    B     9     9   NaN
    3  NaN     8     4   NaN
    4    D     7     2  20.0
    5    C     4     3   NaN