Как рассчитать пропущенные значения на основе других переменных - PullRequest
1 голос
/ 02 ноября 2019

У меня есть датафрейм, как показано ниже:

df = pd.DataFrame({'one' : pd.Series(['a', 'b', 'c', 'd','aa','bb',np.nan,'b','c',np.nan, np.nan] ), 
  'two' : pd.Series([10, 20, 30, 40,50,60,10,20,30,40,50])} )

dataframe

В котором первый столбец - переменные, второй столбец - значения. Значение переменной является константой, которая никогда не изменится.

пример значение 'a' равно 10 , всякий раз, когда представлено 'a', соответствующее значение будет равно 10

Здесь некоторые значения отсутствуют в первом столбце Например: NaN 10, который представляет собой, NaN 40, который является d , как и мудрый информационный кадр, содержит 200 переменных.

Значения не являются непрерывными переменными,они дискретны и несортируемы

В этом случае как мы можем рассчитать пропущенные значения? Ожидаемый результат должен быть:

Expected output

Пожалуйста, помогите мне в этом.

С уважением, Venkat.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2019

Я думаю, что в целом было бы лучше сгруппировать и заполнить. Мы используем DataFrame.groupby:

df.groupby('two').apply(lambda x: x.ffill().bfill())

Это можно сделать без использования группового режима, но вам нужно отсортировать по обоим столбцам:

df.sort_values(['two','one']).ffill().sort_index()

Ниже я покажу вам, как метод, предложенный в другом ответе, может потерпеть неудачу:

Вот пример:

df=pd.DataFrame({'one':['a',np.nan,'c','d',np.nan,'c','b','b',np.nan,'a'],'two':[10,20,30,40,10,30,20,20,30,10]})
print(df)

   one  two
0    a   10
1  NaN   20
2    c   30
3    d   40
4  NaN   10
5    c   30
6    b   20
7    b   20
8  NaN   30
9    a   10

df.sort_values(['two']).fillna(method='ffill').sort_index()


  one  two
0   a   10
1   a   20
2   c   30
3   d   40
4   a   10
5   c   30
6   b   20
7   b   20
8   c   30
9   a   10

Как видно из предложенного метода, в другом из ответов здесь нет ответа ( см. Строку 1 ). Это происходит потому, что некоторое значение NaN может быть первым для определенного значения столбца 'two' и заполнено значением верхней группы.

Этого не произойдет, если мы сгруппируем сначала:

df.groupby('two').apply(lambda x: x.ffill().bfill())

  one  two
0   a   10
1   b   20
2   c   30
3   d   40
4   a   10
5   c   30
6   b   20
7   b   20
8   c   30
9   a   10

Как я уже сказал, мы можем использовать DataFrame.sort_values, но нам нужно отсортировать оба столбца. Я рекомендую вам этот метод .

df.sort_values(['two','one']).ffill().sort_index()

  one  two
0   a   10
1   b   20
2   c   30
3   d   40
4   a   10
5   c   30
6   b   20
7   b   20
8   c   30
9   a   10
1 голос
/ 02 ноября 2019

Попробуйте:

df = df.sort_values(['two']).fillna(method='ffill').sort_index()

Что даст вам

   one  two
0    a   10
1    b   20
2    c   30
3    d   40
4   aa   50
5   bb   60
6    a   10
7    b   20
8    c   30
9    d   40
10  aa   50
0 голосов
/ 02 ноября 2019

Вот оно:

df.ffill(inplace=True)

Вывод:

   one  two
0    a   10
1    b   20
2    c   30
3    d   40
4   aa   50
5   bb   60
6    a   10
7    b   20
8    c   30
9    d   40
10  aa   50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...