promedio - crear columnas en python
Insertar una fila en el marco de datos de los pandas (5)
Tengo un marco de datos ...
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]
y necesito agregar una primera fila [2, 3, 4] para obtener ...
A B C
0 2 3 4
1 5 6 7
2 7 8 9
He probado las funciones de agregar () y concat (), pero de alguna manera no puedo encontrar la manera correcta de hacerlo.
¿Algunas ideas? ¿Hay alguna manera directa de agregar / insertar series en el marco de datos?
Configuré una función corta que permite un poco más de flexibilidad al insertar una fila:
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
que podría acortarse aún más a:
def insert_row(idx, df, df_insert):
return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)
Entonces podrías usar algo como:
df = insert_row(2, df, df_new)
donde 2
es la posición del índice en df
donde desea insertar df_new
.
No estoy seguro de cómo se llamaba concat () pero debería funcionar siempre que ambos objetos sean del mismo tipo. ¿Tal vez el problema es que necesitas lanzar tu segundo vector a un marco de datos? Usando el df que definió los siguientes trabajos para mí.
>>>df2 = pd.DataFrame([[2,3,4]],columns=[''A'',''B'',''C''])
>>>pd.concat([df2,df])
Podemos usar numpy.insert
. Esto tiene la ventaja de la flexibilidad. Solo necesita especificar el índice al que desea insertar.
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
Para np.insert(df.values, 0, values=[2, 3, 4], axis=0)
, 0 le dice a la función el lugar / índice que desea colocar los nuevos valores.
Simplemente asigne una fila a un índice en particular, usando loc
:
df.loc[-1] = [2, 3, 4] # adding a row
df.index = df.index + 1 # shifting index
df = df.sort_index() # sorting by index
Y obtienes, como deseas:
A B C
0 2 3 4
1 5 6 7
2 7 8 9
Ver en la documentación de Pandas Indexación: Configuración con ampliación .
Una forma de lograr esto es
>>> 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
En general, es más fácil agregar marcos de datos, no series. En su caso, dado que desea que la nueva fila esté "en la parte superior" (con el ID de inicio), y no hay ninguna función pd.prepend()
, primero creo el nuevo marco de datos y luego anexo el anterior.
ignore_index
ignorará el viejo índice en curso en su marco de datos y se asegurará de que la primera fila realmente comience con el índice 1
lugar de reiniciar con el índice 0
.
Descargo de responsabilidad típico: Cetero censeo ... filas anexas es una operación bastante ineficiente. Si le importa el rendimiento y de alguna manera puede asegurarse de crear primero un marco de datos con el índice correcto (más largo) y luego simplemente insertando la fila adicional en el marco de datos, definitivamente debe hacerlo. Ver:
>>> 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)]
Hasta ahora, tenemos lo que tenías como df
:
>>> df2
Out[339]:
A B C
0 NaN NaN NaN
1 5 6 7
2 7 8 9
Pero ahora puede insertar fácilmente la fila de la siguiente manera. Dado que el espacio fue preasignado, esto es más eficiente.
>>> 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