首页 > 解决方案 > 计数器函数返回错误值

问题描述

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

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 |

现在我正在尝试创建一个新列来计算parentId匹配特定id_x. 结果应该看起来像

 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      |

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

标签: pythonpandasfunctionlambda

解决方案


您正在迭代错误的集合。parentId每次比较都使用整个 Dataframe 的所有s。在当前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

推荐阅读