【问题标题】:counter function returns wrong values计数器函数返回错误值
【发布时间】:2021-04-16 14:15:56
【问题描述】:

我有一个看起来像这样的数据框:

p = {'parentId':['071cb2c2-d1be-4154-b6c7-a29728357ef3', 'a061e7d7-95d2-4812-87c1-24ec24fc2dd2', 'Highest Level', '071cb2c2-d1be-4154-b6c7-a29728357ef3'],
     'id_x': ['a061e7d7-95d2-4812-87c1-24ec24fc2dd2', 'd2b62e36-b243-43ac-8e45-ed3f269d50b2', '071cb2c2-d1be-4154-b6c7-a29728357ef3', 'a0e97b37-b9a1-4304-9769-b8c48cd9f184']}
df = pd.DataFrame(data = p)

df
|               parentId               |                 id_x                 |
| ------------------------------------ | ------------------------------------ |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a061e7d7-95d2-4812-87c1-24ec24fc2dd2 |
| a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | d2b62e36-b243-43ac-8e45-ed3f269d50b2 |
|             Highest Level            | 071cb2c2-d1be-4154-b6c7-a29728357ef3 |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a0e97b37-b9a1-4304-9769-b8c48cd9f184 |

现在我正在尝试创建一个新列来计算与特定id_x 匹配的parentId 的数量。结果应该是这样的

 df

|               parentId               |                 id_x                 | Amount |
| ------------------------------------ | ------------------------------------ | ------ |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | 1      |
| a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | d2b62e36-b243-43ac-8e45-ed3f269d50b2 | 0      |
|              Highest Level           | 071cb2c2-d1be-4154-b6c7-a29728357ef3 | 2      |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a0e97b37-b9a1-4304-9769-b8c48cd9f184 | 0      |

这是我为创建这个新列而编写的函数:

def node_counter(id_x, parent_ID):
        for element in id_x:
            counter = 0
            for child in parent_ID:
                if child == element:
                        counter += 1
        return counter 

我现在使用 apply/lambda 将它应用到数据帧并得到以下结果

df['Amount'] = df.apply(lambda x: node_counter(x['id_x'], x['parentId']), axis=1)
df
|               parentId               |                 id_x                 | Amount |
| ------------------------------------ | ------------------------------------ | ------ |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | 4      |
| a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | d2b62e36-b243-43ac-8e45-ed3f269d50b2 | 6      |
|              Highest Level           | 071cb2c2-d1be-4154-b6c7-a29728357ef3 | 2      |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a0e97b37-b9a1-4304-9769-b8c48cd9f184 | 2      |

我的代码有什么问题,为什么我没有得到我想要的结果?

【问题讨论】:

    标签: python pandas function lambda


    【解决方案1】:

    您正在迭代错误的集合。每次比较都使用整个 Dataframe 的所有 parentIds。在当前的node_counter 步骤中,您不需要循环遍历id_x,因为它不是一个系列。

    def node_counter(id_x, parent_ID):
        counter = 0
        for child in parent_ID:
            if child == id_x:
                counter += 1
        return counter 
    df['Amount'] = df.apply(lambda x: node_counter(x['id_x'], df['parentId']), axis=1)
    

    输出:

                                   parentId                                  id_x  Amount
    0  071cb2c2-d1be-4154-b6c7-a29728357ef3  a061e7d7-95d2-4812-87c1-24ec24fc2dd2       1
    1  a061e7d7-95d2-4812-87c1-24ec24fc2dd2  d2b62e36-b243-43ac-8e45-ed3f269d50b2       0
    2                         Highest Level  071cb2c2-d1be-4154-b6c7-a29728357ef3       2
    3  071cb2c2-d1be-4154-b6c7-a29728357ef3  a0e97b37-b9a1-4304-9769-b8c48cd9f184       0
    

    【讨论】:

      【解决方案2】:

      您也可以不使用自定义函数并循环使用.map() 以及.value_counts() 和fillna(),如下所示。这应该为您提供更高效和惯用的编码:

      df['Amount'] = df['id_x'].map(df['parentId'].value_counts()).fillna(0).astype(int)
      
      
      print(df)
      
                                     parentId                                  id_x  Amount
      0  071cb2c2-d1be-4154-b6c7-a29728357ef3  a061e7d7-95d2-4812-87c1-24ec24fc2dd2       1
      1  a061e7d7-95d2-4812-87c1-24ec24fc2dd2  d2b62e36-b243-43ac-8e45-ed3f269d50b2       0
      2                         Highest Level  071cb2c2-d1be-4154-b6c7-a29728357ef3       2
      3  071cb2c2-d1be-4154-b6c7-a29728357ef3  a0e97b37-b9a1-4304-9769-b8c48cd9f184       0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 2011-03-15
        • 2020-11-22
        • 2019-05-02
        • 2019-11-07
        相关资源
        最近更新 更多