python - 用条件连接熊猫细胞的最pythonic方法
问题描述
我有以下 Pandas DataFrame,带有 city 和 arr 列:
city arr final_target
paris 11 paris_11
paris 12 paris_12
dallas 22 dallas
miami 15 miami
paris 16 paris_16
我的目标是填写连接巴黎和 arr 编号的 final_target 列,当城市名称为巴黎时,当名称不是巴黎时仅填写名称。
最pythonic的方法是什么?
解决方案
最pythonic的方法是什么?
这取决于定义。如果它是更可取、最常见和最快的方式,那么np.where
解决方案就是这里最 Pythonic 的方式。
使用numpy.where
,如果需要熊猫,这个解决方案也是矢量化的,所以应该更可取,比如apply
(引擎盖下的循环):
df['final_target'] = np.where(df['city'].eq('paris'),
df['city'] + '_' + df['arr'].astype(str),
df['city'])
熊猫替代品:
df['final_target'] = df['city'].mask(df['city'].eq('paris'),
df['city'] + '_' + df['arr'].astype(str))
df['final_target'] = df['city'].where(df['city'].ne('paris'),
df['city'] + '_' + df['arr'].astype(str))
print (df)
city arr final_target
0 paris 11 paris_11
1 paris 12 paris_12
2 dallas 22 dallas
3 miami 15 miami
4 paris 16 paris_16
性能:
#50k rows
df = pd.concat([df] * 10000, ignore_index=True)
In [157]: %%timeit
...: df['final_target'] = np.where(df['city'].eq('paris'),
...: df['city'] + '_' + df['arr'].astype(str),
...: df['city'])
...:
48.6 ms ± 444 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [158]: %%timeit
...: df['city'] + (df['city'] == 'paris')*('_' + df['arr'].astype(str))
...:
...:
49.2 ms ± 1.37 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [159]: %%timeit
...: df['final_target'] = df['city']
...: df.loc[df['city'] == 'paris', 'final_target'] += '_' + df['arr'].astype(str)
...:
63.8 ms ± 764 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [160]: %%timeit
...: df['final_target'] = df.apply(lambda x: x.city + '_' + str(x.arr) if x.city == 'paris' else x.city, axis = 1)
...:
...:
1.33 s ± 119 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
推荐阅读
- c++ - C ++重载加号运算符以将元素添加到对象
- css - CSS:为什么右边距大于左边距(单位相同)?
- python - 如何在 discord.py 中使用变量的值作为命令名
- python - 从 URL zip 文件中提取数据文件
- reactjs - 如何在不使用组件的情况下更改 URL?
- excel - Laravel - 数据表从过滤数据中导出 excel
- reactjs - 不变量失败:找不到 ID 为 [droppable] 的可丢弃条目
- javascript - 如何将我的通话条件更改为开关盒
- reactjs - 如何在 react-hook-form 7 的寄存器中传递变量
- android - 在片段更改时恢复窗口插图