1
votes

comment créer le produit de nombreuses colonnes dans de nouvelles colonnes pandas

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


0 commentaires

3 Réponses :


2
votes

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)


2 commentaires

Je recherche un moyen qui fonctionnerait pour par exemple 50 colonnes


voir la solution de @mad_. C'est plus générique.



3
votes

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]]


0 commentaires

1
votes

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)


0 commentaires