python - 根据另一列中的运算符填充 NaN 值
问题描述
我有一个这样的数据库(pd.DataFrame):
condition odometer
0 new NaN
1 bad 1100
2 excellent 110
3 NaN 200
4 NaN 2000
5 new 20
6 bad NaN
我想根据“里程表”的值填充“条件”的 NaN:
new: odometer >0 and <= 100
excellent: odometer >100 and <= 1000
bad: odometer >1000
我试图这样做,但它不工作:
for i in range(len(database)):
if math.isnan(database['condition'][i]) == True:
odometer = database['odometer'][i]
if odometer > 0 & odometer <= 100: value = 'new'
elif odometer > 100 & odometer <= 1000: value = 'excellent'
elif odometer > 1000: value = 'bad'
database['condition'][i] = value
还尝试制作第一个“if”条件:
database['condition'][i] == np.nan
但它也不起作用。
解决方案
您可以使用 DataFrame.apply() 使用您的函数生成一个新的条件列,然后替换它。不确定您的列是什么类型。df['condition'].dtype 会告诉你。看起来条件可能是字符串或对象,这可能会在您的逻辑中产生错误。如果是字符串列,则需要进行直接比较 == 'NaN'。如果它是一个对象,你可以使用 np.nan 或 math.nan。我在下面的每个案例中都包含了一个示例数据库。您可能还想测试里程表柱的类型。
import numpy as np
import pandas as pd
# condition column as string
df = pd.DataFrame({'condition':['new','bad','excellent','NaN','NaN','new','bad'], 'odometer':np.array([np.nan, 1100, 110, 200, 2000, 20, np.nan], dtype=object)})
# condition column as object
# df = pd.DataFrame({'condition':np.array(['new','bad','excellent',np.nan,np.nan,'new','bad'], dtype=object), 'odometer':np.array([np.nan, 1100, 110, 200, 2000, 20, np.nan], dtype=object)})
def f(database):
if database['condition'] == 'NaN':
#if np.isnan(database['condition']):
odometer = database['odometer']
if odometer > 0 & odometer <= 100: value = 'new'
elif odometer > 100 & odometer <= 1000: value = 'excellent'
elif odometer > 1000: value = 'bad'
return value
return database['condition']
df['condition'] = df.apply(f, axis=1)
推荐阅读
- r - 如何改变奇数位置的元素?
- reactjs - 使用 React 和 Formik 将值传递给高阶组件
- django - 操作系统错误:/usr/lib/x86_64-linux-gnu/libspatialite.so.7:
- python - tf.map_fn & tf.range 混淆结果
- ios - iOS Storyboard ViewController 变为空白
- sqoop - sqoop 中的映射器数量
- python - 如何在 Python 的散景圆图中添加图例
- java - 在junit测试中模拟用户控制台输入
- c++ - 在成员函数之间传递 const 变量作为数组的索引
- typescript - 下划线作为打字稿语法错误无法理解