如何基于其他列计算值新增数据列?求替代numpy的实现方法
如何在Pandas中基于已有列的计算结果新增数据列?
我想基于已有列的计算结果新增一个数据列。具体需求为:新增名为'small'的列,当'value'列的值小于5时,该列取值为1,否则取值为0。我已了解可通过numpy实现,代码如下:
import pandas as pd import numpy as np rawData = pd.read_csv('data.csv', encoding = 'ISO-8859-1') rawData['small'] = np.where(rawData['value'] < 5, '1', '0')
请问还有其他实现方法吗?
当然有不少更简洁或者更灵活的替代方案,我给你分享几个常用的:
方法1:布尔值直接转整数(最简洁)
Pandas的布尔序列可以直接通过astype(int)转换成整数,True会变成1,False变成0,完美匹配你的需求:
import pandas as pd rawData = pd.read_csv('data.csv', encoding='ISO-8859-1') rawData['small'] = (rawData['value'] < 5).astype(int)
这个方法比np.where更简洁,而且性能也很不错,因为是Pandas原生的向量化操作。
方法2:使用apply自定义判断
如果之后你的判断逻辑变得复杂(比如多条件嵌套),apply可以让你写更灵活的自定义函数,虽然对于这种简单场景性能不如向量化操作,但胜在直观易懂:
rawData['small'] = rawData['value'].apply(lambda x: 1 if x < 5 else 0)
这里用lambda表达式对每个'value'值做判断,返回对应的1或0。
方法3:使用pd.cut处理区间判断
如果以后需要扩展到多个区间的分类(比如小于5、5-10、大于10),pd.cut会是个很好的工具,针对当前需求也能实现:
rawData['small'] = pd.cut( rawData['value'], bins=[-float('inf'), 5, float('inf')], # 划分区间:小于5,大于等于5 labels=[1, 0] # 对应区间的标签 ).astype(int)
这种方法的优势在于扩展性强,后续调整区间只需要修改bins和labels即可。
内容的提问来源于stack exchange,提问作者Min
相关产品推荐
相关产品推荐

