Appy/lambda将函数应用到数据帧,并在其他列中指定条件

2024-10-16 17:17:35 发布

您现在位置: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'],
    'type': ['c', 'c', 'c', 'r']}
df = pd.DataFrame(data = p)

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

我创建了一个函数,用于计算与特定id_x匹配的parentId

 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)

df

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

预期结果

现在,我想用相同的函数创建一个新列Amount c,但仅当typecr时才让它计数

结果应该是这样的


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


r


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

我试过的

我尝试了以下操作,但收到了错误的结果:


df['Amount C'] = df.apply(lambda x: node_counter(x['id_x'], df['parentId']) if (x['type'] == 'c') else 0, axis=1)
df

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

如何在lambda/apply中正确应用if条件


Tags: iddftypelevelamounthighestparentidb243
2条回答

我还必须在parentId的函数中设置索引掩码,并且它起作用了

df['Amount C'] = 0 # set default value 0
mask_type = df['type'] == 'c'  # build index mask
df.loc[mask_type,'Amount C'] = df.loc[mask_type].apply(lambda x: node_counter(x['id_x'], df.loc[mask_type,'parentId']), axis=1)

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

一种解决方案是设置默认值0,然后对切片数据帧使用appy:

df['Amount C'] = 0  # set default value 0
mask_type = df['type'] == 'c'  # build index mask
df.loc[mask_type, 'Amount C'] = df.loc[mask_type].apply(lambda x: node_counter(x['id_x'], df['parentId']), axis=1)

相关问题 更多 >