J'ai une liste A = ['APPLE', 'Orange', 'Mango']

J'ai une trame de données qui ressemble à ça

APPLE APPLE Orange Orange Mango Mango

x.     y.      x.     y.    x.    y.  

1      2       3      3      4     2
:      :       :      :      :     :

Je veux le changer, ajouter une autre colonne appelée fruit après chaque deuxième ligne de sorte que le bloc de données ressemble à ceci:

APPLE APPLE Fruit  Orange Orange Fruit Mango Mango. Fruit

x.     y.    APPLE   x.     y.   Orange x.    y.  Mango

1      2    APPLE    3      3   Orange    4     2   Mango
:      :    APPLE    :      :      :     :          Mango
1
amarykya_ishtmella 27 oct. 2020 à 00:59

2 réponses

Meilleure réponse

C'est loin d'être la meilleure solution, mais cela fonctionne.

import pandas as pd

def add_fruit(df, fruits):
  new_df = pd.DataFrame()
  for fruit in fruits:
    df_copy = df[fruit].copy()
    df_copy["Fruit"] = [fruit] * len(df.index)
    if new_df.empty:
      new_df = df_copy
    else:
      new_df = pd.concat([new_df, df_copy], axis=1, join='inner')
  return new_df

fruits = ['APPLE', 'Orange','Mango']

df = pd.DataFrame([['x', 'y', 'x', 'y', 'x', 'y'], [1, 2, 3, 3, 4, 2], [7,8,9,10,11,12]], columns = ['APPLE','APPLE','Orange','Orange','Mango','Mango'])

print(add_fruit(df, fruits))
0
Martin Gustafsson 26 oct. 2020 à 22:46

Vous pouvez y parvenir de manière dynamique quel que soit le nombre de fruits ou le nombre de colonnes par fruit. Créez simplement une série qui renverra l'index de la colonne à quel endroit nous devrions .insert la colonne ainsi que le nom du fruit.

  1. Vous devez trouver le nombre de noms de colonnes identiques avec value_counts(), puis [df.columns.unique()] est là pour que vous puissiez maintenir l'ordre (sinon value_counts triera et cela ajoutera les colonnes aux mauvais endroits).
  2. Ensuite, ajoutez 1, car vous insérez une colonne après chaque nom de fruit dupliqué (ce qui augmente le nombre de colonnes de 1 par groupe).
  3. Ensuite, prenez la somme cumulée et soustrayez 1, ce qui vous donne la position dont vous avez besoin pour ajouter les colonnes.
  4. Enfin, parcourez srs (la position dans laquelle vous ajoutez des colonnes avec insert) et parcourez également fruit simultanément avec zip:

Voici à quoi ressemble srs et c'est ce que vous parcourez pour ajouter dynamiquement des colonnes:

APPLE     2
Orange    5
Mango     8

-

# df.columns = ['APPLE', 'APPLE', 'Orange', 'Orange', 'Mango', 'Mango']
srs = (df.columns.value_counts()[df.columns.unique()] + 1).cumsum() - 1
fruit = srs.index
for f, i in zip(fruit, srs):
    df.insert(i,f'Fruit{i}',f)
df.columns = df.columns.str.replace('\d+','')
df
Out[1]: 
  APPLE APPLE  Fruit Orange Orange   Fruit Mango Mango  Fruit
0    x.    y.  APPLE     x.     y.  Orange    x.    y.  Mango
1     1     2  APPLE      3      3  Orange     4     2  Mango
2     :     :  APPLE      :      :  Orange     :     :  Mango
0
David Erickson 26 oct. 2020 à 23:11