python - 更改熊猫数据框中预选元素中的列
问题描述
我们有一个包含三个不同列的数据框,如上面的示例(df)所示。此任务的目标是每次第1列中的字母发生变化时,用 np.nan替换第2列的第一个元素。由于正在研究的数据库非常大,因此不能使用 for 循环。此外,每个涉及转变的解决方案都被排除在外,因为它太慢了。
我相信最简单的方法是使用groupby和head方法,但是我不知道如何在原始数据框中替换。
例子:
df = pd.DataFrame([['A','Z',1.11],['B','Z',2.1],['C','Z',3.1],['D', 'X', 2.1], ['E','X',4.3],['E', 'X', 2.1], ['F','X',4.3]])
要选择我们想要更改的元素,我们可以执行以下操作:
df.groupby(by=1).head(1)[2] = np.nan
但是在原始数据框中没有任何变化。
目标是获得以下内容:
编辑:
根据评论,我们不会df[1]
返回已经看过的组,例如['Z', 'Z', 'X', 'Z']
不可能。
解决方案
您可以numpy.where
用于向量化条件赋值。这假设df[1]
已经排序。
df[2] = np.where(df[1].duplicated(), df[2], np.nan)
如果不能假设排序:
df[2] = np.where(df[1] != df[1].shift(), np.nan, df[2])
结果:
0 1 2
0 A Z NaN
1 B Z 2.1
2 C Z 3.1
3 D X NaN
4 E X 4.3
5 E X 2.1
6 F X 4.3
等效逻辑可以使用pd.DataFrame.mask
.
推荐阅读
- authentication - 当您处理多个集成时,最好的用户登录旅程是什么?
- javascript - 发送请求时出现 Express 标头错误
- python - Python:如何在字符串列表的 For 循环中增加元素?
- angular - Ionic5 prod 构建错误 - 未知组件
- sql - 如何获取仅分配给一个值而没有其他值的唯一ID的计数?
- html - GSC depsite 模式中不可解析的结构化数据错误在结构化数据测试工具上签出
- arrays - 如何在kotlin简单的for每个循环中存储值
- json - 从 Solr 导出索引数据
- python - 绘制公司的增长率
- reactjs - 如何使用钩子将数据从一个组件传递到另一个组件