Подтвердить что ты не робот

Можно ли вставить строку в произвольное положение в фреймворке данных с помощью pandas?

У меня есть объект DataFrame, похожий на этот:

       onset    length
1      2.215    1.3
2     23.107    1.3
3     41.815    1.3
4     61.606    1.3
...

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

       onset    length
1      2.215    1.3
2     23.107    1.3
3     30.000    1.3  # new row
4     41.815    1.3
5     61.606    1.3
...

Каким будет лучший способ сделать это?

4b9b3361

Ответ 1

Вы можете нарезать и использовать concat, чтобы получить то, что вы хотите.

line = DataFrame({"onset": 30.0, "length": 1.3}, index=[3])
df2 = concat([df.iloc[:2], line, df.iloc[3:]]).reset_index(drop=True)

Это создаст кадр данных в вашем примере вывода. Насколько мне известно, concat - лучший метод для выполнения операции вставки в pandas, но по общему признанию, я ни в коем случае не эксперт pandas.

Ответ 2

Я нахожу это более читабельным, чтобы сортировать, а не нарезать и объединять.

line = DataFrame({"onset": 30.0, "length": 1.3}, index=[2.5])
df = df.append(line, ignore_index=False)
df = df.sort_index().reset_index(drop=True)

Ответ 3

Используйте код ниже:

from numpy import nan as Nan
import pandas as pd

df1 = pd.DataFrame({'Column1': ['A0', 'total', 'A2', 'A3'],'Column2': ['B0', 'B1', 
'B2', 'B3'],'Column3': ['C0', 'C1', 'C2', 'C3'],'Column4': ['D0', 'D1', 'D2', 
'D3']},index=[0, 1, 2, 3])

for index, row in df1.iterrows():
    if row["Column1"] == 'total':
        df1 = pd.DataFrame(np.insert(df1.values, index+1, values=[" "] * 
              len(df1.columns), axis=0),columns = df1.columns)

print (df1)

Входные данные:

  Column1 Column2 Column3 Column4
0      A0      B0      C0      D0
1   total      B1      C1      D1
2      A2      B2      C2      D2
3      A3      B3      C3      D3

Выход:

  Column1 Column2 Column3 Column4
0      A0      B0      C0      D0
1   total      B1      C1      D1
2                                
3      A2      B2      C2      D2
4      A3      B3      C3      D3