我有一个数据框,其中包含特定列的nan值。在遍历行时,如果遇到nan
(使用isnan()
方法),那么我需要将其更改为其他值(因为我有一些条件)。我尝试使用replace()
和fillna()
与limit
参数,但他们正在修改整个列,当他们遇到第一个nan
值?是否有任何方法可以为特定的nan
赋值而不是更改列的所有值?
示例:数据框看起来像:
points sundar cate king varun vicky john charlie target_class
1 x2 5 'cat' 4 10 3 2 1 NaN
2 x3 3 'cat' 1 2 3 1 1 NaN
3 x4 6 'lion' 8 4 3 7 1 NaN
4 x5 4 'lion' 1 1 3 1 1 NaN
5 x6 8 'cat' 10 10 9 7 1 0.0
我有一个像这样的清单
a = [1.0, 0.0]
而且我希望如此
points sundar cate king varun vicky john charlie target_class
1 x2 5 'cat' 4 10 3 2 1 1.0
2 x3 3 'cat' 1 2 3 1 1 1.0
3 x4 6 'lion' 8 4 3 7 1 1.0
4 x5 4 'lion' 1 1 3 1 1 0.0
5 x6 8 'cat' 10 10 9 7 1 0.0
我想根据某些条件更改target_class值,并指定上面列表的值。
我认为需要将NaN
s值替换为1
,仅用于列表idx
中指定的索引:
mask = df['target_class'].isnull()
idx = [1,2,3]
df.loc[mask, 'target_class'] = df[mask].index.isin(idx).astype(int)
print (df)
points sundar cate king varun vicky john charlie target_class
1 x2 5 'cat' 4 10 3 2 1 1.0
2 x3 3 'cat' 1 2 3 1 1 1.0
3 x4 6 'lion' 8 4 3 7 1 1.0
4 x5 4 'lion' 1 1 3 1 1 0.0
5 x6 8 'cat' 10 10 9 7 1 0.0
要么:
idx = [1,2,3]
s = pd.Series(df.index.isin(idx).astype(int), index=df.index)
df['target_class'] = df['target_class'].fillna(s)
编辑:
从注释解决方案是使用DataFrame.loc
按索引和列值分配值:
df2.loc['x2', 'target_class'] = list1[0]
我认为你输入nan
值的条件不依赖于列中的数量。在下面的代码中,我将所有插补规则存储在一个函数中,该函数接收整行(包含nan
)和您正在研究的列作为参数。如果您还需要插补规则的所有数据帧,只需将其传递给replace_nan
函数即可。在示例中,我使用其他列的平均值来插入col
元素。
import pandas as pd
import numpy as np
def replace_nan(row, col):
row[col] = row.drop(col).mean()
return row
df = pd.DataFrame(np.random.rand(5,3), columns = ['col1', 'col2', 'col3'])
col_to_impute = 'col1'
df.loc[[1, 3], col_to_impute] = np.nan
df = df.apply(lambda x: replace_nan(x, col_to_impute) if np.isnan(x[col_to_impute]) else x, axis=1)
你唯一应该做的就是做出正确的分配。也就是说,在包含空值的行中进行赋值。
示例数据集:
,event_id,type,timestamp,label
0,asd12e,click,12322232,0.0
1,asj123,click,212312312,0.0
2,asd321,touch,12312323,0.0
3,asdas3,click,33332233,
4,sdsaa3,touch,33211333,
注意:最后两行在列中包含空值:'label'。然后,我们加载数据集:
df = pd.read_csv('dataset.csv')
现在,我们制定了适当的条件:
cond = df['label'].isnull()
现在,我们对这些行进行分配(我不知道赋值的逻辑。因此我为NaN分配了1个值):
df1.loc[cond,'label'] = 1
还有另一种更准确的方法。可以使用fillna()方法。您应该提供合理的信息以帮助您。