Supongamos que tengo las siguientes listas:
cond_1 = [1,2]
cond_2 = [3,5]
Así como la siguiente trama de datos df
:
|----------|
| Column_1 |
|----------|
| x |
|----------|
| y |
|----------|
| y |
|----------|
| x |
|----------|
Lo que yo quiero hacer, es añadir una segunda columna Column_2
. Siguiendo estos criterios:
1) si Column_1
contiene una x
, añadir un valor en Column_2
de cond_1
;
2) si Column_1
contiene una y
, agregue un valor de Column_2
decond_2
La salida deseada debe ser como este:
|----------|----------|
| Column_1 | Column_2 |
|----------|----------|
| x | 1 |
|----------|----------|
| y | 3 |
|----------|----------|
| y | 5 |
|----------|----------|
| x | 2 |
|----------|----------|
He estado tratando de hacer esto utilizando pd.Series
:
df_x = df.loc[df['Column_1'] == "x"] #first I create a dataframe only with the x values
df_x['Column_2'] = pd.Series(cond_1)
A continuación, me gustaría repetir lo mismo para los y
valores, obteniendo df_y
.
Sin embargo, esto no tiene éxito. Entonces, yo tendría que añadir de nuevo las dos tramas de datos ( df_x
y df_y
) y perder información sobre el índice original que quiero mantener a df
.
Puede crear una clase de ayuda y utilizarla en una .apply
, por ejemplo:
class ReplaceWithNext:
def __init__(self, **kwargs):
self.lookup = {k: iter(v) for k, v in kwargs.items()}
def __call__(self, value):
return next(self.lookup[value])
Luego usarlo como:
df['Column_2' ] = df['Column_1'].apply(ReplaceWithNext(x=cond_1, y=cond_2))
Which'll darle:
Column_1 Column_2
0 x 1
1 y 3
2 y 5
3 x 2