Añadir lista como una columna a una trama de datos

George-w:

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_1contiene una x, añadir un valor en Column_2de cond_1;

2) si Column_1contiene una y, agregue un valor de Column_2decond_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 yvalores, obteniendo df_y.

Sin embargo, esto no tiene éxito. Entonces, yo tendría que añadir de nuevo las dos tramas de datos ( df_xy df_y) y perder información sobre el índice original que quiero mantener a df.

Jon Clements:

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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=387738&siteId=1
Recomendado
Clasificación