J'ai un data frame pandas :
df = pd.DataFrame({ 'dummy_1' : [0, 0, 0, 1, 1, 0],
'dummy_2' : [1, 1, 0, 0, 1, 1],
'dummy_3' : [1, 1, 1, 0, 0, 0],
'dummy_12' :[0, 0, 0, 0, 1, 0],
'dummy_13' :[0, 0, 0, 0, 0, 0],
'dummy_23' :[1, 1, 0, 0, 0, 0]})
Je voudrais ajouter comme nouvelles colonnes (dans le même dataframe) le produit, le produit avec chaque colonne , avec les deux autres.
Pour que le dataframe résultant ressemble à ceci:
import pandas as pd
df = pd.DataFrame({'dummy_1' : [0, 0, 0, 1, 1, 0],
'dummy_2' : [1, 1, 0, 0, 1, 1],
'dummy_3' : [1, 1, 1, 0, 0, 0]})
Y a-t-il un moyen efficace de faire cela? Et par efficace, j'entends une manière qui fonctionnerait par exemple. 50 colonnes
3 Réponses :
Vous avez besoin de:
dummy_1 dummy_2 dummy_3 dummy_12 dummy_13 dummy_23 0 0 1 1 0 0 1 1 0 1 1 0 0 1 2 0 0 1 0 0 0 3 1 0 0 0 0 0 4 1 1 0 1 0 0 5 0 1 0 0 0 0
Résultat:
import pandas as pd
df = pd.DataFrame({'dummy_1' : [0, 0, 0, 1, 1, 0],
'dummy_2' : [1, 1, 0, 0, 1, 1],
'dummy_3' : [1, 1, 1, 0, 0, 0]})
df['dummy_12'] = df['dummy_1']*df['dummy_2']
df['dummy_13'] = df['dummy_1']*df['dummy_3']
df['dummy_23'] = df['dummy_2']*df['dummy_3']
print(df)
Je recherche un moyen qui fonctionnerait pour par exemple 50 colonnes
voir la solution de @mad_. C'est plus générique.
Utilisez itertools.combinations pour obtenir toutes les combinaisons et parcourir ces combinaisons pour calculer le produit vectorisé et l'assigner à la nouvelle colonne
dummy_1 dummy_2 dummy_3 dummy_12 dummy_13 dummy_23 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0
Sortie
import pandas as pd
from itertools import combinations
df = pd.DataFrame({'dummy_1' : [0, 0, 0, 1, 1, 0],
'dummy_2' : [1, 1, 0, 0, 1, 1],
'dummy_3' : [1, 1, 1, 0, 0, 0]})
for i in combinations(df.columns, 2):
col_name = i[0] + i[1].split('_')[-1]
df[col_name] = df[i[0]] * df[i[1]]
Cela devrait répondre à vos besoins sans nécessiter d'importations supplémentaires, modifiez simplement la plage maximale de i et j pour l'utiliser sur une trame de données plus grande (par exemple 50).
dummy_1 dummy_2 dummy_3 dummy_12 dummy_13 dummy_23 0 0 1 1 0 0 1 1 0 1 1 0 0 1 2 0 0 1 0 0 0 3 1 0 0 0 0 0 4 1 1 0 1 0 0 5 0 1 0 0 0 0
Résultat:
for i in range(0, 3):
for j in range(i + 1, 3):
df['dummy_%d%d' %(i+1, j+1)] = df.apply(lambda x: x[i] * x[j], axis=1)