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
4 respuestas
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.
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
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
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']))
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.