python - 如何有效地映射 pandas 中的新变量

标签 python pandas dataframe

这是我的数据

Id  Amount
1   6
2   2
3   0
4   6

我需要的是映射:如果Amount大于3Map1。但是,如果 Amount 小于 3,则 Map0

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)

它可以工作,但可配置性不高,而且效率不高。

最佳答案

将 bool 掩码转换为整数:

#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 - 如何有效地映射 pandas 中的新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51374862/

相关文章:

python - 如何在 Ubuntu 上为 Python3 安装 python deb 包?

python - 用于文档分类的 scipy/sklearn 稀疏矩阵分解

python - 如何提取给定交易所每只股票的股票数据

python - 通过列表理解将 str.lower 应用到 Pandas

python - 在大尺寸数据框上填充多列默认值的有效方法

Pandas Dataframe 重命名行中的重复值

Python在for循环中计算许多不同的总和

Python 3.7 urllib.request 返回 &nbsp 而不是内容

python - Pandas MultiIndex Dataframe 到 Excel |第二个索引作为列名

python - 将前 n 个非 NaN 单元格保留在 pandas DataFrame 的每一行中