【问题标题】:In pandas dataframe, generate third column data based on results in two other columns在 pandas 数据框中,根据其他两列中的结果生成第三列数据
【发布时间】:2016-09-21 18:27:45
【问题描述】:

我是数据框的新手。我有列ABC 并想使用A 和B 中的数据在C 中创建一个值。例如,如果A = 1 和/或B = 1,那么我想放置1 在列 C 中,并为数据框中的所有行执行此逻辑。

例如起始数组:

         A  B  C
0        1  0  
1        0  1  
2        1  1  
3        0  0  

结果数组:

         A  B  C
0        1  0  1
1        0  1  1
2        1  1  1
3        0  0  0

【问题讨论】:

    标签: python pandas dataframe boolean conditional-statements


    【解决方案1】:

    给定起始 DF:

    df = pd.DataFrame({'A': [1, 0, 1, 0], 'B': [0, 1, 1, 0]})
    

    然后您可以像这样创建列C

    df['C'] = (df == 1).any(axis=1).astype(int)
    

    然后离开df为:

       A  B  C
    0  1  0  1
    1  0  1  1
    2  1  1  1
    3  0  0  0
    

    【讨论】:

    • df['C'] = (df == 1).any(axis=1).astype(int) 或许就足够了?
    • @JohnGalt 是的 - 我很傻 - 谢谢。我已经更新了答案。
    【解决方案2】:

    使用numpy.where:

    df['C'] = np.where(df.A | df.B, 1, 0)
    print (df)
       A  B  C
    0  0  0  0
    1  0  1  1
    2  1  0  1
    3  1  1  1
    
    df['C'] = np.where((df.A == 0) & (df.B == 0), 0, 1)
    print (df)
       A  B  C
    0  0  0  0
    1  0  1  1
    2  1  0  1
    3  1  1  1
    

    或者通过astype更简单地将布尔值Series转换为int

    df['C'] = (df.A | df.B).astype(int)
    print (df)
       A  B  C
    0  0  0  0
    1  0  1  1
    2  1  0  1
    3  1  1  1
    
    df['C'] = (~((df.A == 0) & (df.B == 0))).astype(int)
    print (df)
       A  B  C
    0  0  0  0
    1  0  1  1
    2  1  0  1
    3  1  1  1
    

    【讨论】:

      【解决方案3】:

      使用list comprehesionzip 的其他解决方案

      df['C'] = [(1 if i or j == 1 else 0) for i,j in zip(df['A'], df['B'])]
      

      它返回:

         A  B  C
      0  1  0  1
      1  0  1  1
      2  1  1  1
      3  0  0  0
      

      如果'A''B' == 更改条件1 使用&

      例子:

      df['C'] = [(1 if i & j == 1 else 0) for i,j in zip(df['A'], df['B'])]
      

      这将返回:

         A  B  C
      0  1  0  0
      1  0  1  0
      2  1  1  1
      3  0  0  0
      

      【讨论】:

        【解决方案4】:
        def f(x):
        
            if (x.B==1) and (x.A !=1): #Or whatever logic you like
                return 1
            else: 
                return 0
        
        df['C'] = df.apply(lambda x: f(x), axis = 1)
        

        【讨论】:

          【解决方案5】:

          可以使用numpylogical_andlogical_or的逻辑函数

          import numpy as np
          
          df['C'] = np.logical_and(df['A'], df['B']).astype(int)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-02
            • 2021-08-27
            • 1970-01-01
            相关资源
            最近更新 更多