Como el marco de datos d1 a continuación, A1 corresponde a B1, A2 corresponde a B2, y así sucesivamente. Quiero cambiar el valor de B1-3 con la condición de: B o C = copiar 2 veces, D = copiar 3 veces, como el marco de datos objetivo .

d1 = DataFrame([{'A1': 'A', 'A2': 'A', 'A3': '', 'B1': '2', 'B2': '2', 'B3': ''},
                {'A1': 'A', 'A2': 'C', 'A3': '', 'B1': '2', 'B2': '2', 'B3': ''},
                {'A1': 'A', 'A2': 'B', 'A3': 'C', 'B1': '2', 'B2': '4', 'B3': '4'},
                {'A1': 'A', 'A2': 'C', 'A3': 'D', 'B1': '2', 'B2': '2', 'B3': '4'}])

d1
    A1  A2  A3  B1  B2  B3
0   A   A       2   2   
1   A   C       2   2   
2   A   B   C   2   4   4
3   A   C   D   2   2   4
target = DataFrame([{'A1': 'A', 'A2': 'A', 'A3': '', 'B1': '2', 'B2': '2', 'B3': ''},
                {'A1': 'A', 'A2': 'C', 'A3': '', 'B1': '2', 'B2': '22', 'B3': ''},
                {'A1': 'A', 'A2': 'B', 'A3': 'C', 'B1': '2', 'B2': '44', 'B3': '44'},
                {'A1': 'A', 'A2': 'C', 'A3': 'D', 'B1': '2', 'B2': '22', 'B3': '444'}])
target

    A1  A2  A3  B1  B2  B3
0   A   A       2   2   
1   A   C       2   22  
2   A   B   C   2   44  44
3   A   C   D   2   22  444 

Y he intentado usar np.where para la condición de B y C, pero parece que solo se aplica en B para copiar el valor. ¿Hay algún método para alcanzarlo?

Acol = ['A1','A2','A3']
Bcol = ['B1','B2','B3']
d1[Bcol] = np.where(d1[Acol] == ('B' or 'C'), d1[Bcol]+d1[Bcol], d1[Bcol])
d1

    A1  A2  A3  B1  B2  B3
0   A   A       2   2   
1   A   C       2   2   
2   A   B   C   2   44  4
3   A   C   D   2   2   4
2
xiumpt 10 may. 2019 a las 08:27

4 respuestas

La mejor respuesta

Sugeriría almacenar las condiciones del multiplicador para A, B, ... en un diccionario y aplicarlo así:

multiplier_map={'':1,'A':1,'B':2,'C':2,'D':3}
for i in [1,2,3]:
    df['B{0}'.format(i)]=df['B{0}'.format(i)]*df['A{0}'.format(i)].map(multiplier_map)

Tenga en cuenta que multiplier_map también debe contener una cadena vacía como clave.

2
Asmus 10 may. 2019 a las 05:49

Quizás estas cuatro líneas:

d1.loc[d1['A2'].eq('B') | d1['A2'].eq('C'), 'B2'] += d1.loc[d1['A2'].eq('B') | d1['A2'].eq('C'), 'B2']
d1.loc[d1['A2'].eq('D'), 'B2'] += d1.loc[d1['A2'].eq('D'), 'B2'] + d1.loc[d1['A2'].eq('D'), 'B2']
d1.loc[d1['A3'].eq('B') | d1['A3'].eq('C'), 'B3'] += d1.loc[d1['A3'].eq('B') | d1['A3'].eq('C'), 'B3']
d1.loc[d1['A3'].eq('D'), 'B3'] += d1.loc[d1['A3'].eq('D'), 'B3'] + d1.loc[d1['A3'].eq('D'), 'B3']

Y ahora:

print(df)

Es:

  A1 A2 A3 B1  B2   B3
0  A  A     2   2     
1  A  C     2  22     
2  A  B  C  2  44   44
3  A  C  D  2  22  444
1
U10-Forward 10 may. 2019 a las 05:39

Usando np.select

for col in ('A1','A2','A3'):
    new_col = 'B'+col[-1]
    mask1 = df[col] == 'A'
    mask2 = (df[col] == 'B') | (df[col] == 'C')
    mask3 = df[col] == 'D'
    df[new_col] = df[new_col].astype('str')
    df[new_col] = np.select([mask1, mask2, mask3], [df[new_col], df[new_col]*2, df[new_col]*3], df[new_col])

Salida:

    A1  A2  A3  B1  B2  B3
0   A   A       2   2   
1   A   C       2   22  
2   A   B   C   2   44  44
3   A   C   D   2   22  444
2
AkshayNevrekar 10 may. 2019 a las 05:56

Intente a continuación:

d1['B1'] = np.where( d1['A1'].isin(['B' , 'C']), d1['B1'] * 2, np.where(d1['A1'].isin(['D']), d1['B1'] * 3, d1['B1']))
d1['B2'] = np.where( d1['A2'].isin(['B' , 'C']), d1['B2'] * 2, np.where(d1['A2'].isin(['D']), d1['B2'] * 3, d1['B2']))
d1['B3'] = np.where( d1['A2'].isin(['B' , 'C']), d1['B3'] * 2, np.where(d1['A3'].isin(['D']), d1['B3'] * 3, d1['B3']))
1
hacker315 10 may. 2019 a las 06:28