Вставка строки в 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...]