pandas - 熊猫从列列表中分配结果
问题描述
假设我有一个如下所示的数据框:
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({'A':np.random.randn(5), 'B': np.zeros(5), 'C': np.zeros(5)})
df
>>>
A B C
0 0.496714 0.0 0.0
1 -0.138264 0.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 0.0
我有我想用值 1 填充的列列表,当A
它是负数时。
idx = df.A < 0
cols = ['B', 'C']
所以在这种情况下,我希望索引 [1, 'B'] 和 [4, 'C'] 设置为 1。
我尝试了什么:
但是,doingdf.loc[idx, cols] = 1
会将整行设置为 1,而不仅仅是单个列。我也尝试过这样做df.loc[idx, cols] = pd.get_dummies(cols)
,结果是:
A B C
0 0.496714 0.0 0.0
1 -0.138264 0.0 1.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 NaN NaN
我假设这是因为索引get_dummies
和数据框没有对齐。
预期输出:
A B C
0 0.496714 0.0 0.0
1 -0.138264 1.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 1.0
那么什么是最好的(阅读最快的)方法来做到这一点。就我而言,有 1000 行和 5 列。
结果时间:
TLDR:直接编辑值更快。
%%timeit
df.values[idx, df.columns.get_indexer(cols)] = 1
每个循环 123 µs ± 2.5 µs(7 次运行的平均值 ± 标准偏差,每次 10000 个循环)
%%timeit
df.iloc[idx.array,df.columns.get_indexer(cols)]=1
每个循环 266 µs ± 7 µs(7 次运行的平均值 ± 标准偏差,每次 1000 个循环)
解决方案
使用 numpy 索引来提高性能:
idx = df.A < 0
res = ['B', 'C']
arr = df.values
arr[idx, df.columns.get_indexer(res)] = 1
print (arr)
[[ 0.49671415 0. 0. ]
[-0.1382643 1. 0. ]
[ 0.64768854 0. 0. ]
[ 1.52302986 0. 0. ]
[-0.23415337 0. 1. ]]
df = pd.DataFrame(arr, columns=df.columns, index=df.index)
print (df)
A B C
0 0.496714 0.0 0.0
1 -0.138264 1.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 1.0
选择:
idx = df.A < 0
res = ['B', 'C']
df.values[idx, df.columns.get_indexer(res)] = 1
print (df)
A B C
0 0.496714 0.0 0.0
1 -0.138264 1.0 0.0
2 0.647689 0.0 0.0
3 1.523030 0.0 0.0
4 -0.234153 0.0 1.0
推荐阅读
- angular - Angular Guard 中的 Http 调用以验证 JWT
- python - TypeError: filter 必须是 dict、bson.son.SON 或任何其他继承自 collections.Mapping 的类型的实例
- excel - Excel 搜索、查找、复制粘贴宏
- security - 如何将 Nessus 用于内部网络?
- html - 无法完全缩放图像,并使用溢出:隐藏工作
- javascript - Javascript:如何在午夜刷新页面?
- vba - 无法从图像链接数组中抓取第一个图像链接
- python - Pandas 读取行和列中具有多个标题以及合并单元格的 excel 表
- c# - 如何将我的默认 GnuPG 密钥环位置更改为 Windows 操作系统中的不同位置
- coroutine - 什么证明使用协程而不是子例程是合理的?