Вставка строки в pandas dataframe

У меня есть dataframe..

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

   A  B  C
0  5  6  7
1  7  8  9

[2 rows x 3 columns]

и мне нужно добавить первую строку [2, 3, 4], чтобы получить..

   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

Я пробовал функции append() и concat(), но почему-то не могу найти правильный способ, как это сделать.

Любые идеи? Есть ли какой-либо прямой способ добавления/вставки серии в dataframe?

Ответ 1

Просто присвойте строку определенному индексу, используя loc:

 df.loc[-1] = [2, 3, 4]  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index

И вы получите, как пожелаете:

    A  B  C
 0  2  3  4
 1  5  6  7
 2  7  8  9

См. Документацию Pandas. Индексация: настройка с увеличением.

Ответ 2

Один из способов добиться этого -

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

Как правило, проще всего добавлять фреймы данных, а не ряды. В вашем случае, так как вы хотите, чтобы новая строка была "сверху" (с начальным идентификатором), и нет функции pd.prepend(), я сначала создаю новый фреймворк, а затем добавляю старый.

ignore_index будет игнорировать старый текущий индекс в вашем фрейме данных и убедиться, что первая строка начинается с индекса 1 вместо перезапуска с индексом 0.

Типичный отказ от ответственности: Cetero censeo... добавление строк - довольно неэффективная операция. Если вы заботитесь о производительности и можете как-то обеспечить, чтобы сначала создать фреймворк с правильным (более длинным) индексом, а затем просто вставить дополнительную строку в фреймворк данных, вам обязательно нужно это сделать. См:

>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]: 
     A    B    C
0    5    6    7
1    7    8    9
2  NaN  NaN  NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]

До сих пор у нас было то, что у вас было как df:

>>> df2
Out[339]: 
     A    B    C
0  NaN  NaN  NaN
1    5    6    7
2    7    8    9

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

>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

Ответ 3

Не уверен, как вы вызывали concat(), но он должен работать до тех пор, пока оба объекта одного типа. Может быть, проблема в том, что вам нужно передать свой второй вектор в dataframe? Используя df, который вы определили, для меня работают следующие.

>>>df2 = pd.DataFrame([[2,3,4]],columns=['A','B','C'])
>>>pd.concat([df2,df])

Ответ 4

Я собрал короткую функцию, которая позволяет немного больше гибкости при вставке строки:

def insert_row(idx, df, df_insert):
    dfA = df.iloc[:idx, ]
    dfB = df.iloc[idx:, ]

    df = dfA.append(df_insert).append(dfB).reset_index(drop = True)

    return df

который может быть дополнительно сокращен до:

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

Затем вы можете использовать что-то вроде:

df = insert_row(2, df, df_new)

где 2 - позиция индекса в df, где вы хотите вставить df_new.

Ответ 5

Мы можем использовать numpy.insert. Это имеет преимущество гибкости. Вам нужно только указать индекс, который вы хотите вставить.

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))

    0   1   2
0   2   3   4
1   5   6   7
2   7   8   9

Для np.insert(df.values, 0, values=[2, 3, 4], axis=0), 0 сообщает функции место/индекс, в который вы хотите поместить новые значения.

Ответ 6

Ниже представлен лучший способ вставить строку в кадр данных pandas без сортировки и сброса индекса:

import pandas as pd

df = pd.DataFrame(columns=['a','b','c'])

def insert(df, row):
    insert_loc = df.index.max()

    if pd.isna(insert_loc):
        df.loc[0] = row
    else:
        df.loc[insert_loc + 1] = row

insert(df,[2,3,4])
insert(df,[8,9,0])
print(df)

Ответ 7

это может показаться слишком простым, но невероятно, что простая функция вставки новой строки не встроена. Я много читал о добавлении нового df к оригиналу, но мне интересно, будет ли это быстрее.

df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]