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

时间:2018-09-02 11:06:01

标签: python-3.x pandas nan

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

3 个答案:

答案 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()方法。您应该提供逻辑上的帮助。