python - 计数器函数返回错误值
问题描述
我有一个看起来像这样的数据框:
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 |
我的代码有什么问题,为什么我没有得到我想要的结果?
解决方案
您正在迭代错误的集合。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
推荐阅读
- python - Bottle 框架资源利用率
- excel - 如何仅将包含字母“A”的某些列/数据字段引入数据透视表?
- git - 如何将子文件夹的副本复制到 Git 中的单独存储库中?
- ionic-framework - httpClient 的问题我收到此错误
- python - 除非从根目录运行,否则 Python 库不会加载
- kubernetes - 如何为 Confluent Rest-Proxy 配置负载均衡器粘性
- google-maps - 谷歌地图潜在的配额滥用场景
- javascript - 如何为 javascript 对象动态地创建变量名?
- r - 将 R 中的任意函数列表组合成新函数 [元编程]
- c# - 使用存储过程更新动态名称表