apply&字典

大家好,好久不见,再次介绍下本人。中山大学,医学生+计科学生的集合体,机器学习爱好者。又开始进入万年记不住的字典坑了,加上apply用法,双坑齐下,特此总结。

import pandas as pd
data=pd.DataFrame({'ct':[1,1,2,2,3],'1_tf':[10,20,30,40,50]})
co_1f_dict = data.groupby('ct')['1_tf'].mean().to_dict()

一列(加不加reset_index不影响df类型)
part1:表明只能是列做字典映射

a = data['ct'].reset_index(drop=True)
print(a)
# 0    1
# 1    1
# 2    2
# 3    2
# 4    3
# Name: ct, dtype: int64
print(a.iloc[0])
#1
print(co_1f_dict[a.iloc[0]])
#15


b = data['ct']
print(b)
# 0    1
# 1    1
# 2    2
# 3    2
# 4    3
# Name: ct, dtype: int64
print(b.iloc[0])
#1
print(co_1f_dict[b.iloc[0]])
#15


c = data[['ct']]
print(c)
#    ct
# 0              1
# 1              1
# 2              2
# 3              2
# 4              3
print(c.iloc[0])
#ct    1
# Name: 0, dtype: int64
print(co_1f_dict[c.iloc[0]])
#报错

一列(加不加reset_index不影响df类型)
part2:表明只能是df做apply字典映射

d = data[['ct']].apply(lambda x: x.iloc[0], axis=1)
print(d)
# 0    1
# 1    1
# 2    2
# 3    2
# 4    3
# dtype: int64
d1 = data[['ct']].apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(d1)
# 0    15
# 1    15
# 2    35
# 3    35
# 4    50
# dtype: int64


e = data['ct'].apply(lambda x: x.iloc[0], axis=1)
print(e)
e1 = data['ct'].apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(e1)
#报错


f = data['ct'].reset_index(drop=True).apply(lambda x: x.iloc[0], axis=1)
print(f)
f1 = data['ct'].reset_index(drop=True).apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(f1)
#报错

两列
part3:表明多列只能用df用apply能做字典映射

A = data['ct','1_tf'].reset_index(drop=True)
print(A)
print(A.iloc[0])
print(co_1f_dict[A.iloc[0]])
#报错


B = data['ct','1_tf']
print(B)
print(B.iloc[0])
print(co_1f_dict[B.iloc[0]])
#报错


C = data[['ct','1_tf']]
print(C)
#    ct  1_tf
# 0              1           10
# 1              1           20
# 2              2           30
# 3              2           40
# 4              3           50
print(C.iloc[0])
# ct     1
# 1_tf      10
# Name: 0, dtype: int64
print(co_1f_dict[C.iloc[0]])
#报错


D = data[['ct','1_tf']].apply(lambda x: x.iloc[0], axis=1)
print(D)
# 0    1
# 1    1
# 2    2
# 3    2
# 4    3
# dtype: int64
D1 = data[['ct','1_tf']].apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(D1)
# 0    15
# 1    15
# 2    35
# 3    35
# 4    50
# dtype: int64


E = data['ct','1_tf'].apply(lambda x: x.iloc[0], axis=1)
print(E)
E1 = data['ct','1_tf'].apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(E1)
#报错


F = data['ct','1_tf'].reset_index(drop=True).apply(lambda x: x.iloc[0], axis=1)
print(F)
F1 = data['ct'].reset_index(drop=True).apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(F1)
#报错

感觉永远都搞不清楚字典和apply的用法,希望此文能加深理解。

```python # apply() 和 map() 的典型用法对比 df['col_new'] = df['col'].apply(lambda x: x * 2) df['col_new'] = df['col'].map({1: 'low', 2: 'medium', 3: 'high'}) ``` ### ✅ `apply()` 与 `map()` 的区别: 虽然 `apply()` 和 `map()` 都可以对 Pandas 的 `Series` 进行元素级操作,但它们在**设计目的、使用场景和功能上存在显著差异**。 --- ### 🔍 详细解释: | 特性 | `map()` | `apply()` | |------|--------|----------| | **所属对象** | 只能用于 `Series` | 可用于 `Series` 和 `DataFrame` | | **主要用途** | 元素级映射:替换值或一对一转换(类似字典查找) | 更通用:可应用任意函数(包括聚合、条件判断等) | | **输入类型** | 字典、函数、Series | 函数(lambda 或自定义)、可调用对象 | | **处理缺失值** | 支持自动对齐 NaN,并可用 `na_action='ignore'` 忽略 | 正常传入函数处理,需手动控制逻辑 | | **性能** | ✅ 更快(底层优化,适合简单映射) | 相对慢一些(更灵活的封装) | | **是否支持向量化** | 是(尤其是用字典时) | 否(除非函数本身是向量化的) | --- ### 🧩 使用示例对比 #### ✅ 1. 使用 `map()`:适合简单的值替换或编码 ```python # 示例:将性别编码为数字 gender_map = {'male': 0, 'female': 1} df['sex_code'] = df['sex'].map(gender_map) # 或者直接使用函数(较少见) df['length'] = df['name'].map(len) # 计算每个名字长度 ``` > ⚠️ 注意:如果原数据中有不在字典中的值,则结果为 `NaN`。 > 可加参数避免干扰: > ```python > df['sex_code'] = df['sex'].map(gender_map, na_action='ignore') # 不处理 NaN > ``` --- #### ✅ 2. 使用 `apply()`:适合复杂逻辑或返回非标量 ```python # 示例:根据年龄分组 def age_group(x): if x < 18: return 'Child' elif x < 60: return 'Adult' else: return 'Senior' df['age_category'] = df['age'].apply(age_group) ``` ```python # 示例:apply 可以返回更复杂的结构(如元组),而 map 不行 df['age_square'] = df['age'].apply(lambda x: x**2 if pd.notna(x) else 0) ``` --- #### ✅ 3. 在 DataFrame 上只能用 `apply()` ```python # 对每行求和 df['total'] = df.apply(lambda row: row['a'] + row['b'], axis=1) # 对每列求均值 df_summary = df.apply(lambda col: col.mean()) ``` > ❌ `map()` 不能用于 DataFrame,会报错。 --- ### 📝 总结选择建议: | 场景 | 推荐方法 | |------|---------| | 简单的一一对应替换(如类别编码) | ✅ `map()`(更快更清晰) | | 使用字典进行值映射 | ✅ `map()` | | 复杂逻辑、条件分支、数学变换 | ✅ `apply()` | | 操作整个 DataFrame 的行/列 | ✅ `apply()` | | 提高性能的关键映射任务 | ✅ `map()` | --- ### 💡 小技巧:何时混用? 有时可以结合使用: ```python # 先用 map 做快速映射,再用 apply 处理剩余逻辑 df['label'] = df['status'].map({'A': 'Active', 'I': 'Inactive'}) df['label'] = df['label'].apply(lambda x: x if pd.notna(x) else 'Unknown') ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值