2017-07-22 7 views
3

Supposons, une trame de données est sous la forme:produit cartésien des colonnes d'une trame de données et la mise en lignes nouvellement créées à 0 en Python

column1 column2 is_duplicate 
0 xyz  XYZ   1 
1 xyz  XyZ   1 
2 abc  ABC   1 
3 abc  aBc   1 

Comment effectuer un produit cartésien sur column1 et column2 de telle sorte que les lignes nouvellement créées auront une valeur 0 alors que les lignes originales auront toujours 1 dans la colonne is_duplicate?

dataframe après la sortie attendue:

column1 column2 is_duplicate 
0 xyz  XYZ   1 
1 xyz  XyZ   1 
2 xyz  ABC   0 
3 xyz  aBc   0 
4 abc  XYZ   0 
5 abc  XyZ   0 
6 abc  ABC   1 
7 abc  aBc   1 

Répondre

3

Vous pouvez utiliser pd.MultiIndex.from_product pour former le produit cartésien. Comme il est un index, vous pouvez passer à df.reindex d'élargir le dataframe d'inclure une ligne pour chaque valeur de l'indice:

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'column1': ['xyz', 'xyz', 'abc', 'abc'], 
        'column2': ['XYZ', 'XyZ', 'ABC', 'aBc'], 
        'is_duplicate': [1, 1, 1, 1]}) 

cols = ['column1', 'column2'] 
index = pd.MultiIndex.from_product([df[col].unique() for col in cols], 
            names=cols) 
result = df.set_index(['column1','column2']).reindex(index, fill_value=0).reset_index() 
print(result) 

rendements

column1 column2 is_duplicate 
0  xyz  XYZ    1 
1  xyz  XyZ    1 
2  xyz  ABC    0 
3  xyz  aBc    0 
4  abc  XYZ    0 
5  abc  XyZ    0 
6  abc  ABC    1 
7  abc  aBc    1 
+0

Merci! Cela a fonctionné comme le charme. J'ai besoin de chercher sur MultiIndex et comment cela fonctionne. Merci pour l'avance. –