Заполнение отсутствующих индексов в фрейме данных со значениями в этом фрейме данных [дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

18
задан mati 18 September 2014 в 21:52
поделиться

3 ответа

set_index и reset_index - ваши друзья.

df = DataFrame({"A":[0,0.5,1.0,3.5,4.0,4.5], "B":[1,4,6,2,4,3], "C":[3,2,1,0,5,3]})

Сначала переместите столбец A в индекс:

In [64]: df.set_index("A")
Out[64]: 
     B  C
 A        
0.0  1  3
0.5  4  2
1.0  6  1
3.5  2  0
4.0  4  5
4.5  3  3

Затем переиндексируйте с новым индексом, здесь недостающие данные заполняются с помощью nans. Мы используем объект Index, так как мы можем назвать его; это будет использовано на следующем шаге.

In [66]: new_index = Index(arange(0,5,0.5), name="A")
In [67]: df.set_index("A").reindex(new_index)
Out[67]: 
      B   C
0.0   1   3
0.5   4   2
1.0   6   1
1.5 NaN NaN
2.0 NaN NaN
2.5 NaN NaN
3.0 NaN NaN
3.5   2   0
4.0   4   5
4.5   3   3

Наконец, верните индекс обратно в столбцы с помощью reset_index. Поскольку мы назвали индекс, все это работает магически:

In [69]: df.set_index("A").reindex(new_index).reset_index()
Out[69]: 
       A   B   C
0    0.0   1   3
1    0.5   4   2
2    1.0   6   1
3    1.5 NaN NaN
4    2.0 NaN NaN
5    2.5 NaN NaN
6    3.0 NaN NaN
7    3.5   2   0
8    4.0   4   5
9    4.5   3   3
22
ответ дан cronos 19 August 2018 в 01:11
поделиться

В этом случае я переписываю ваш столбец A с недавно сгенерированным фреймворком данных и объединяя его с вашим исходным df, я затем прибегаю к нему:

    In [177]:

df.merge(how='right', on='A', right = pd.DataFrame({'A':np.arange(df.iloc[0]['A'], df.iloc[-1]['A'] + 0.5, 0.5)})).sort(columns='A').reset_index().drop(['index'], axis=1)
Out[177]:
     A   B   C
0  0.0   1   3
1  0.5   4   2
2  1.0   6   1
3  1.5 NaN NaN
4  2.0 NaN NaN
5  2.5 NaN NaN
6  3.0 NaN NaN
7  3.5   2   0
8  4.0   4   5
9  4.5   3   3

Таким образом, в общем случае вы можете настроить arange, которая принимает начальное и конечное значение, обратите внимание, что я добавил 0.5 к концу, так как диапазоны открыты закрытыми и передают значение шага.

Более общий метод может быть таким:

In [197]:

df = df.set_index(keys='A', drop=False).reindex(np.arange(df.iloc[0]['A'], df.iloc[-1]['A'] + 0.5, 0.5))
df.reset_index(inplace=True) 
df['A'] = df['index']
df.drop(['A'], axis=1, inplace=True)
df.reset_index().drop(['level_0'], axis=1)
Out[197]:
   index   B   C
0    0.0   1   3
1    0.5   4   2
2    1.0   6   1
3    1.5 NaN NaN
4    2.0 NaN NaN
5    2.5 NaN NaN
6    3.0 NaN NaN
7    3.5   2   0
8    4.0   4   5
9    4.5   3   3

Здесь мы устанавливаем индекс в столбец A, но не отбрасываем его, а затем переиндексируем df с помощью функции arange.

1
ответ дан EdChum 19 August 2018 в 01:11
поделиться

Используя ответ от EdChum выше, я создал следующую функцию

def fill_missing_range(df, field, range_from, range_to, range_step=1, fill_with=0):
    return df\
      .merge(how='right', on=field,
            right = pd.DataFrame({field:np.arange(range_from, range_to, range_step)}))\
      .sort_values(by=field).reset_index().fillna(fill_with).drop(['index'], axis=1)

Пример использования:

fill_missing_range(df, 'A', 0.0, 4.5, 0.5, np.nan)
2
ответ дан JustAC0der 19 August 2018 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: