我有一个数据框,其中包含特定列中的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的值,并分配上述列表的值。
答案 0 :(得分:1)
我认为仅需要为列表NaN
中指定的索引将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]
答案 1 :(得分: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)
答案 2 :(得分:0)
您唯一要做的就是进行正确的分配。也就是说,在包含空值的行中进行分配。
示例数据集:
,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,
注意:最后两行在“标签”列中包含空值。然后,我们加载数据集:
df = pd.read_csv('dataset.csv')
现在,我们使适当的条件为:
cond = df['label'].isnull()
现在,我们在这些行上进行分配(我不知道分配的逻辑。因此,我为NaN分配了1个值):
df1.loc[cond,'label'] = 1
还有另一种更准确的方法。可以使用fillna()方法。您应该提供逻辑上的帮助。