Панды: вставьте много строк в определенном месте - PullRequest
0 голосов
/ 20 ноября 2018

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

У меня есть фрейм данных со многими строками и одним столбцом, включаяСтрока со значением заполнителя, которую я хочу заменить:

old = pd.DataFrame(['A','B','placeholder','C','D'],index=[0,1,2,3,4])

У меня есть второй кадр данных того же формата, который я хочу вставить в местоположение заполнителя:

new = pd.DataFrame(['E','F'],index=[0,1])

Конечный результат должен выглядеть следующим образом:

     0
0    A
1    B
2    E
3    F
4    C
5    D

Я могу получить индекс строки заполнителя:

ind = old.index[old[0]=='placeholder']

На основании других вопросов, подобных этому, я подумал следующеекод должен делать то, что я хочу:

old.loc[ind] = new

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

new = pd.DataFrame(['E','F'],index=[2,2.5])

Это именно то, что я хочу, но проблема в том, что я не знаю, как автоматизироватьназначение индекса.Реальные рамки данных, с которыми я работаю, огромны и уже имеют индексы на основе 0, поэтому мне нужно изменить исходные индексы new на что-то вроде:

np.arange(ind, ind+1, 1/len(new))

Но здесь я нахожусь в тупикедва аспекта:

  1. Как преобразовать ind (индекс заполнителя) в формат, который я действительно могу использовать?В настоящее время это Int64Index, поэтому я не могу использовать его для np.arange(), а ind.astype(float), похоже, ничего не делает.

  2. Как только у меня есть список новыхиндексы, как я могу заменить существующие индексы в new новыми индексами?

Или, существует ли более эффективный подход полностью?Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Поскольку индексы в old являются последовательными числами, мы можем его использовать.

Первый шаг - прочитать (и сохранить) индекс строки заполнителя:

plhInd = old.index[old[0] == 'placeholder'].tolist()[0]

Затем вы можете сгенерировать 2 кадра данных: часть «до» (old_1) и часть «после» (old_2):

old_1 = old[old.index < plhInd]
old_2 = old[old.index > plhInd]

Затем, чтобы получить результат, используйте appendс ignore_index=True (два цепных вызова):

result = old_1.append(new, ignore_index=True).append(old_2, ignore_index=True)

Когда вы print(result) получаете:

   0
0  A
1  B
2  E
3  F
4  C
5  D

Нет необходимости «регенерировать» индекс, потому что под ignore_index=True«следующие» индексы генерируются автоматически.

0 голосов
/ 20 ноября 2018

Вы можете изменить индекс new, добавить его к old, а затем отсортировать и сбросить индекс.

import pandas as pd

idx = old.eq('placeholder').idxmax()[0]
new.index = idx + new.index/len(new)

pd.concat([old.drop(idx), new]).sort_index().reset_index(drop=True)

#   0
#0  A
#1  B
#2  E
#3  F
#4  C
#5  D

Или разделить DataFrame и объединить новую деталь посередине:

new = pd.DataFrame(['E','F'],index=[0,1])  # re-initialize

idx = old.eq('placeholder').idxmax()[0]
pd.concat([old.iloc[:idx], new, old.iloc[idx+1:]], ignore_index=True)

#   0
#0  A
#1  B
#2  E
#3  F
#4  C
#5  D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...