1
votes

Double occurrence des valeurs d'une colonne et mise à jour de la valeur d'une autre colonne

Mon ensemble de données ressemble à ceci:

Country | ProductType
USA     | A
USA     | B
China   | A
China   | B
Japan   | A
Japan   | B
Ireland | A
Ireland | B
France  | A
France  | B

Je dois dupliquer l'occurrence de chaque pays et attribuer une valeur correspondante dans la colonne ProductType pour donner à chaque pays le produit A et B. p>

Ce que je recherche:

Country | ProductType 
USA     |    A        
China   |    B        
Japan   |    A        
Ireland |    B        
France  |    A        

Des idées sur la manière pythonique de faire cela? Désolé pour le titre terriblement vague. Cheers :)


2 commentaires

Pourquoi voulez-vous dupliquer des valeurs? Quel est votre objectif final? On dirait que ProductType n'est pas une colonne importante.


Bonjour, je ne duplique pas productType, mais je duplique le pays afin qu'un pays répertorié ait à la fois le produit A et le produit B.


3 Réponses :


5
votes

Utilisez pd.melt , comme suit:

df['A'] = 'A'
df['B'] = 'B'
pd.melt(df, id_vars='Country', value_vars=['A', 'B']).sort_values('Country')


0 commentaires

4
votes

Vous pouvez essayer quelque chose comme ceci pour créer un nouveau dataframe avec un constructeur en utilisant product d'itertools.

   Country ProductType
0      USA           A
1      USA           B
2    China           A
3    China           B
4    Japan           A
5    Japan           B
6  Ireland           A
7  Ireland           B
8   France           A
9   France           B

Résultat:

from itertools import product
pd.DataFrame(product(df['Country'].unique(), df['ProductType'].unique()), columns=['Country','ProductType'])


3 commentaires

TypeError: l'argument de données ne peut pas être un itérateur


Quelle version de python utilisez-vous? et quelle version de pandas?


Python 3.7.1, Pandas '0.23.4'



2
votes

Dans les pandas, vous pouvez le faire avec MultiIndex

pd.MultiIndex.from_product(list(map(set,df.values.T.tolist()))).to_frame()
Out[1148]: 
                 0  1
France  A   France  A
        B   France  B
China   A    China  A
        B    China  B
Japan   A    Japan  A
        B    Japan  B
USA     A      USA  A
        B      USA  B
Ireland A  Ireland  A
        B  Ireland  B


0 commentaires