python - Izquierda justificar valores de cadena en un marco de datos de pandas
string dataframe (1)
Primero, extraiga una porción de columnas que comience con el
item
:
m = df.columns.str.contains(''item'')
i = df.iloc[:, m]
Enmascare todos los valores que cumplan con sus criterios.
Use
isin
-
j = i[~i.isin(df.makrc.tolist() + [''not''])]
Ahora. ordenar valores basados en NaNs y asignar de nuevo -
df.loc[:, m] = j.apply(sorted, key=pd.isnull, axis=1)
df
key sellyr brand makrc item1 item2 item3 item4 item5 item6
0 da12 2013 imp apt furi NaN NaN NaN NaN NaN
1 da32 2013 sa rye app NaN NaN NaN NaN NaN
2 da14 2013 sa pro pan fan NaN NaN NaN NaN
Detalles
i
item1 item2 item3 item4 item5 item6
0 furi apt NaN NaN NaN NaN
1 rye app NaN NaN NaN NaN
2 not pro pan fan NaN NaN
j
item1 item2 item3 item4 item5 item6
0 furi NaN NaN NaN NaN NaN
1 NaN app NaN NaN NaN NaN
2 NaN NaN pan fan NaN NaN
Hacia un mejor rendimiento
Podría utilizar una versión modificada de la función
justified
de Divakar que funciona en matrices de objetos:
def justify(a, invalid_val=0, axis=1, side=''left''):
"""
Justifies a 2D array
Parameters
----------
A : ndarray
Input array to be justified
axis : int
Axis along which justification is to be made
side : str
Direction of justification. It could be ''left'', ''right'', ''up'', ''down''
It should be ''left'' or ''right'' for axis=1 and ''up'' or ''down'' for axis=0.
"""
if invalid_val is np.nan:
mask = pd.notnull(a)
else:
mask = a!=invalid_val
justified_mask = np.sort(mask,axis=axis)
if (side==''up'') | (side==''left''):
justified_mask = np.flip(justified_mask,axis=axis)
out = np.full(a.shape, invalid_val, dtype=object)
if axis==1:
out[justified_mask] = a[mask]
else:
out.T[justified_mask.T] = a.T[mask.T]
return out
df.loc[:, m] = justify(j.values, invalid_val=np.nan, axis=1, side=''left'')
df
key sellyr brand makrc item1 item2 item3 item4 item5 item6
0 da12 2013 imp apt furi NaN NaN NaN NaN NaN
1 da32 2013 sa rye app NaN NaN NaN NaN NaN
2 da14 2013 sa pro pan fan NaN NaN NaN NaN
Esto (con suerte) debería ser más rápido que
apply
.
Verá especialmente ganancias de velocidad utilizando la versión original de la función que está optimizada para datos numéricos.
Entonces, tengo un DataFrame con 180000+ valores y necesito (1) reemplazar duplicados y ciertos valores en celdas por fila y (2) reorganizar. Aquí está mi DataFrame, df:
key sellyr brand makrc item1 item2 item3 item4 item5 item6
0 da12 2013 imp apt furi apt nan nan nan nan
1 da32 2013 sa rye rye app nan nan nan nan
2 da14 2013 sa pro not pro pan fan nan nan
........
los valores nan representan np.nan. Y la cadena prohibida es ''no''.
Entonces, lo que necesito hacer es verificar las columnas item1 ~ 6 reemplazar cadenas que están contenidas en la columna makrc con nan. Además, también quiero reemplazar ''not''s'' con nan''s. Después de reemplazar las cadenas a np.nan, necesito reorganizar el elemento 1 ~ 6 a la izquierda para justificar los datos que no son nan a la celda vacía más a la izquierda, como se muestra a continuación, (salida esperada):
key sellyr brand makrc item1 item2 item3 item4 item5 item6
0 da12 2013 imp apt furi nan nan nan nan nan
1 da32 2013 sa rye app nan nan nan nan nan
2 da14 2013 sa pro pan fan nan nan nan nan
........
Entonces, como puede ver en un primer índice, eliminé la cadena apt en item2 y la cambié a np.nan porque la misma cadena está en la columna makrc. En el índice 1, eliminé centeno y lo reemplacé por np.nan. Pero esta vez, reorganicé la cadena ''app'' de item2 a item1 porque los valores de np.nan deberían ir después de los valores. En el índice 2, he reemplazado pro y no desde que necesito reemplazar cada ''not''string en las columnas del elemento para np.nan. También he reorganizado los artículos.
Intenté combinar todas las columnas de elementos como una lista y reemplazarla, pero hay algunas filas con solo elementos np.nan. ¿Pueden recomendarme un proceso ideal para resolver mi problema? Muchas gracias.