Python中保留NaN值的同时替换DataFrame列非空值为指定列表元素的思路咨询
Python中保留NaN值的同时替换DataFrame列非空值为指定列表元素的思路咨询
当然可以呀!在Stack Overflow社区里,只要你把问题背景、需求描述清楚,哪怕暂时没有可运行的代码片段,寻求思路性的指导完全是允许的~ 你现在的问题描述很清晰,没问题的😊
先确认下你的原始DataFrame是这样的:
| well | sample |
|---|---|
| A1 | 1 |
| NaN | 2 |
| NaN | 3 |
| A2 | 1 |
| NaN | 2 |
| A3 | 1 |
| NaN | 2 |
| NaN | 3 |
你的核心需求是:把well列中非NaN的行(也就是A1、A2、A3对应的行),和列表[0,31,20]的元素一一对应,实现两种可能的效果之一:
选项1:直接替换well列的非空值
最终要得到的结果是:
| well | sample |
|---|---|
| 0 | 1 |
| NaN | 2 |
| NaN | 3 |
| 31 | 1 |
| NaN | 2 |
| 20 | 1 |
| NaN | 2 |
| NaN | 3 |
针对选项1的思路提示:
- 先通过
df['well'].notna()生成布尔索引,精准定位well列中所有非空的行; - 由于非空行的数量和你的目标列表
[0,31,20]长度完全匹配,直接将列表值赋值给这些筛选出来的行即可; - 注意赋值时要基于布尔索引操作,避免误修改到原本为NaN的行。
选项2:新增一列存放列表值,保留原well列
最终要得到的结果是:
| well | sample | Position |
|---|---|---|
| A1 | 1 | 0 |
| NaN | 2 | NaN |
| NaN | 3 | NaN |
| A2 | 1 | 31 |
| NaN | 2 | NaN |
| A3 | 1 | 20 |
| NaN | 2 | NaN |
| NaN | 3 | NaN |
针对选项2的思路提示:
- 第一步同样用
df['well'].notna()获取需要填充值的行的布尔索引; - 先新增一个默认全为
NaN的列,比如用df['Position'] = np.nan初始化; - 再将你的列表值,精准赋值给新列中对应非空行的位置;
- 也可以先创建一个和原DataFrame长度一致、默认NaN的数组,把列表值放到对应非空行的位置后,再转为DataFrame的新列。
另外,你之前尝试df.replace()用字典的方式没成功,可能是因为replace()默认是全局匹配替换,而你需要的是仅针对非NaN行的位置赋值,不是匹配具体的well值(比如A1、A2)来替换,所以换个“定位行→赋值”的思路会更合适哦~
备注:内容来源于stack exchange,提问作者Soef
相关产品推荐
相关产品推荐

