python - 如何有效地在熊猫中映射新变量
问题描述
这是我的数据
Id Amount
1 6
2 2
3 0
4 6
我需要的是映射: if Amount
is more than 3
, Map
is 1
。但是,如果 Amount
小于3
,Map
是0
Id Amount Map
1 6 1
2 2 0
3 0 0
4 5 1
我做了什么
a = df[['Id','Amount']]
a = a[a['Amount'] >= 3]
a['Map'] = 1
a = a[['Id', 'Map']]
df= df.merge(a, on='Id', how='left')
df['Amount'].fillna(0)
它有效,但不是高度可配置且无效。
解决方案
将布尔掩码转换为整数:
#for better performance convert to numpy array
df['Map'] = (df['Amount'].values >= 3).astype(int)
#pure pandas solution
df['Map'] = (df['Amount'] >= 3).astype(int)
print (df)
Id Amount Map
0 1 6 1
1 2 2 0
2 3 0 0
3 4 6 1
性能:
#[400000 rows x 3 columns]
df = pd.concat([df] * 100000, ignore_index=True)
In [133]: %timeit df['Map'] = (df['Amount'].values >= 3).astype(int)
2.44 ms ± 97.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [134]: %timeit df['Map'] = (df['Amount'] >= 3).astype(int)
2.6 ms ± 66.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
推荐阅读
- python - 在列表字典中找到最大列表范围的更好(更整洁)的方法是什么
- android - 如何使用 kotlin 在 android 中将 base 64 字符串转换为位图?
- html - 如何从谷歌脚本的不同功能加载多个 HTML
- excel - 在 VBA 中用今天的日期替换错误 #N/A
- docker - 如何解释 /dev/vda1?
- javascript - SectionList 的内容从 Web 浏览器可见,但在 iOS 中不可见
- php - 重用 Laravel 模型创建代码的代码
- php - php数组:从api循环遍历多维数组
- javascript - 为什么 useEffect 不对依赖项做出反应?
- excel - 将 vba 调整为新插入的列