Как изменить значение ячейки, содержащей Nan, на другое значение? - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть фрейм данных, который содержит значения 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 голосов
/ 02 сентября 2018

Единственное, что вы должны сделать, это сделать правильное назначение. То есть сделайте присваивание в строках, которые содержат нули.

Пример набора данных:

,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()

Теперь мы выполняем присвоение по этим строкам (я не знаю логического назначения. Поэтому я присваиваю 1 значение NaN):

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

Есть еще более точные подходы. Метод fillna () может быть использован. Вы должны предоставить логическое, чтобы помочь вам.

0 голосов
/ 02 сентября 2018

Я считаю, что нужно заменить 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)

EDIT:

Решением для комментариев является присвоение значений по индексу и значениям столбцов с помощью DataFrame.loc:

df2.loc['x2', 'target_class'] = list1[0]
0 голосов
/ 02 сентября 2018

Полагаю, ваши условия для вменения значений 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)
...