Digamos: tengo un marco de datos como este:
import pandas as pd df = pd.DataFrame({'a':['a1','a2','a3','a4','a5'],'b':[1,2,3,4,5]})Producción:
ab 0 a1 1 1 a2 2 2 a3 3 3 a4 4 4 a5 5 Ahora me gustaría agregar nuevas columnas correspondientes a a1 , a2 , a3 , a4 , a5
for index, row in df.iterrows(): df[index] = np.NaNProducción:
ab 0 1 2 3 4 0 a1 1 NaN NaN NaN NaN NaN 1 a2 2 NaN NaN NaN NaN NaN 2 a3 3 NaN NaN NaN NaN NaN 3 a4 4 NaN NaN NaN NaN NaN 4 a5 5 NaN NaN NaN NaN NaN¿Cómo puedo generar una matriz triangular en el marco de datos?
Me gustaría la siguiente salida:
ab 0 1 2 3 4 0 a1 1 a1 a2 a3 a4 a5 1 a2 2 NaN a2 a3 a4 a5 2 a3 3 NaN NaN a3 a4 a5 3 a4 4 NaN NaN NaN a4 a5 4 a5 5 NaN NaN NaN NaN a5¿Debo construir un marco de datos adicional como una matriz triangular y luego fusionarme? ¿Cuál es la manera más sencilla?
Esto funcionará:
for i in range(df.shape[0]): df.iloc[i, i+2:] = df['a'][i:]Producción:
>>> df ab 0 1 2 3 4 0 a1 1 NaN NaN NaN NaN NaN 1 a2 2 NaN NaN NaN NaN NaN 2 a3 3 NaN NaN NaN NaN NaN 3 a4 4 NaN NaN NaN NaN NaN 4 a5 5 NaN NaN NaN NaN NaN >>> for i in range(df.shape[0]): ... df.iloc[i, i+2:] = df['a'][i:] >>> df ab 0 1 2 3 4 0 a1 1 a1 a2 a3 a4 a5 1 a2 2 NaN a2 a3 a4 a5 2 a3 3 NaN NaN a3 a4 a5 3 a4 4 NaN NaN NaN a4 a5 4 a5 5 NaN NaN NaN NaN a5Un enfoque eficiente sería usar numpy ( numpy.tile y numpy.triu ):
import numpy as np np.triu(np.tile(df['a'].values, (len(df), 1)))Luego crea un marco de datos y únete:
df.join(pd.DataFrame(np.triu(np.tile(df['a'].values, (len(df), 1))), index=df.index ).replace({0: pd.NA}))producción:
ab 0 1 2 3 4 0 a1 1 a1 a2 a3 a4 a5 1 a2 2 <NA> a2 a3 a4 a5 2 a3 3 <NA> <NA> a3 a4 a5 3 a4 4 <NA> <NA> <NA> a4 a5 4 a5 5 <NA> <NA> <NA> <NA> a5 n = len(df) df.join(pd.DataFrame(np.tile(df['a'].values, (n, 1)), index=df.index ).where(np.triu(np.ones((n, n))).astype(bool)))producción:
ab 0 1 2 3 4 0 a1 1 a1 a2 a3 a4 a5 1 a2 2 NaN a2 a3 a4 a5 2 a3 3 NaN NaN a3 a4 a5 3 a4 4 NaN NaN NaN a4 a5 4 a5 5 NaN NaN NaN NaN a5Mi solución fue similar a mozway pero no en 3 pasos :)
import pandas as pd import numpy as np d = { "a":['a1','a2','a3','a4','a5'] } "create dataframe from dict" df = pd.DataFrame(d) indek1 = list(df.index) column1 = df['a'].values lista_tot = [] for k in indek1: lista_tot.append(column1) a = np.triu(lista_tot, 0) df1 = pd.DataFrame(a) print(df1) df = df.join(df1) print(df)