【问题标题】:How do I create a new dataframe column based on two other columns?如何基于其他两列创建新的数据框列?
【发布时间】:2022-01-21 15:39:45
【问题描述】:

如果下表中两列的值在同一范围内,我想创建一个表示 1 的二进制列。例如,cat_1 的值在 5-10 之间,cat_2 的值也在 5-10 之间,则应为 1,否则应为 0。

| cat_1.   | cat_2.         | [5-10] (new column to be created|
| -------- | -------------- | --------------------------------|
| 5        | 10             |1.                               |
| 7        | 9.             |1                                |
| 1        | 7.             |0                                |

到目前为止,我已经尝试了以下代码,但它返回错误:

df.loc[((df['cat_1l'] >= 5 & df['cat_1'] <= 10) 
       & (df['cat_2'] >= 5 & result['cat_2'] <= 10)), '[5-10]' = 1

这是错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    pandas 使用按位运算(& |),每个条件都应该用括号括起来,否则会报错。

    尝试使用 () 将每个条件包装起来,例如 (df['cat_1l'] &gt;= 5) &amp; (...),以查看错误是否消失。

    但是,您可以使用between 函数简化您的操作。

    df['[5-10]'] = (df.cat_1.between(5, 10) & df.cat_2.between(5, 10)).astype(int)
    

    【讨论】:

      【解决方案2】:

      您收到错误的原因是&amp; 的评估优先于&gt;=。要修复您的 sn-p,请在列比较周围添加括号:

      df.loc[((df['cat_1l'] >= 5) & (df['cat_1'] <= 10) 
             & (df['cat_2'] >= 5) & (result['cat_2'] <= 10)), '[5-10]' = 1
      

      更好的是,最好将新列定义为一个整体,而不使用.loc 进行子集化。考虑例如:

      df['[5-10]'] = df['cat1'].between(5, 10) & df['cat_2'].between(5, 10)
      

      【讨论】:

        【解决方案3】:

        在这种情况下,您还可以使用apply() 在其他列的基础上创建一个新列。

        这里,我把cat_1和cat_2两列的值传进去,做成一个新列,如下:

        import pandas as pd
        
        df = pd.DataFrame(
            {
                'cat_1': [5, 7, 1],
                'cat_2': [10, 9, 7],
            }
        )
        
        
        def check_in_range(x):
            cat_1, cat_2 = x
            start = 5
            end = 10
            if (start <= cat_1 <= end) and (start <= cat_2 <= end):
                return 1
            else:
                return 0
        
        df['new'] = df[['cat_1', 'cat_2']].apply(check_in_range, axis=1)
        
        print(df)
        #   cat_1  cat_2  new
        #0      5     10    1
        #1      7      9    1
        #2      1      7    0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-25
          • 2023-03-22
          • 1970-01-01
          • 2017-01-03
          • 2021-12-30
          相关资源
          最近更新 更多