如何将包含nan的单元格的值更改为另一个特定值?

问题描述 投票:0回答:3

我有一个数据框,其中包含特定列的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值,并指定上面列表的值。

python-3.x pandas nan
3个回答
1
投票

我认为需要将NaNs值替换为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]

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)

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,

注意:最后两行在列中包含空值:'label'。然后,我们加载数据集:

df = pd.read_csv('dataset.csv')

现在,我们制定了适当的条件:

cond = df['label'].isnull()

现在,我们对这些行进行分配(我不知道赋值的逻辑。因此我为NaN分配了1个值):

df1.loc[cond,'label'] = 1

还有另一种更准确的方法。可以使用fillna()方法。您应该提供合理的信息以帮助您。

© www.soinside.com 2019 - 2024. All rights reserved.