2017-09-18 6 views
3

Je souhaite créer une feuille de calcul Excel et insérer un nombre égal de lignes pour chaque variable. Le résultat idéal doit ressembler à Colonnes A & B dans l'image. Ce que je peux faire jusqu'ici est seulement d'insérer pour 1 nom (Colonnes D & E), et n'ai aucune idée faire l'énumération appropriée pour le reste.Écrire des données multi-indexées dans un fichier Excel avec Python/Pandas

name and food

C'est ce que j'ai:

import xlwt, xlrd 
import os 

current_file = xlwt.Workbook() 
write_table = current_file.add_sheet('Sheet1') 

name_list = ["Jack", "David", "Andy"] 
food_list = ["Ice-cream", "Mango", "Apple", "Cake"] 

total_rows = len(name_list) * len(food_list) # how to use it? 

write_table.write(0, 0, "Jack") 

for row, food in enumerate(food_list): 
    write_table.write(row, 1, food) 

current_file.save("c:\\name_food.xls") 

Comment puis-je faire pour tous? Je vous remercie.

+1

Pourquoi est-ce marqué pandas géants? Vous ne l'importez même pas. –

+0

@COLDSPEED, j'imagine que les Pandas peuvent faire de la magie ici. :) –

+1

Il ne sert à rien de demander une solution pandas sauf si vous avez des pandas et envisagez sérieusement d'utiliser la solution que quelqu'un vous fournit. Si vous êtes alors c'est bien. –

Répondre

3

Quelque chose comme cela devrait fonctionner:

import xlwt, xlrd 
import os 

current_file = xlwt.Workbook() 
write_table = current_file.add_sheet('Sheet1') 

name_list = ["Jack", "David", "Andy"] 
food_list = ["Ice-cream", "Mango", "Apple", "Cake"] 

for i, name in enumerate(name_list): 
    write_table.write(i * len(food_list), 0, name_list[i]) 

    for row, food in enumerate(food_list): 
     write_table.write(i * len(food_list) + row, 1, food) 

current_file.save("c:\\name_food.xls") 

L'important est

write_table.write(i * len(food_list), 0, name_list[i]) 

où vous dites que le nom doit être écrit en lignes 0, 4, 8, 12 ...

En outre, une partie

write_table.write(i * len(food_list) + row, 1, food) 

écrit la nourriture à la section correspondante augmentée par le numéro de rangée.

+0

Merveilleux! C'est une pensée incroyable. Merci pour l'aide. btw, si cela vous dérange, je choisis COOLSPEED pour la réponse? –

+0

Bien sûr que non.Ce sont de bonnes solutions. – Fejs

+0

généreux! c'est le tien. –

4

Vous pouvez créer DataFrame par numpy.tile et numpy.repeat puis retirez dupliqués dans a colonne:

df = pd.DataFrame({'a': np.repeat(name_list, len(food_list)), 
        'b': np.tile(food_list, len(name_list))}) 

df['a'] = np.where(df['a'].duplicated(), '', df['a']) 
print (df) 
     a   b 
0 Jack Ice-cream 
1    Mango 
2    Apple 
3    Cake 
4 David Ice-cream 
5    Mango 
6    Apple 
7    Cake 
8 Andy Ice-cream 
9    Mango 
10    Apple 
11    Cake 

Une autre solution avec la compréhension de la liste:

df = pd.DataFrame({'a': [y for x in name_list for y in [x] + [''] * (len(food_list)-1)], 
        'b': food_list * len(name_list)}) 
print (df) 
     a   b 
0 Jack Ice-cream 
1    Mango 
2    Apple 
3    Cake 
4 David Ice-cream 
5    Mango 
6    Apple 
7    Cake 
8 Andy Ice-cream 
9    Mango 
10    Apple 
11    Cake 

et dernière écriture to_excel:

df.to_excel('c:\\name_food.xls', index=False, header=False) 
+0

merci! C'est absolument un super bonus dans l'apprentissage. Souhaitez-vous que je choisis la solution utilisée xlrd la réponse? –

+1

C'est à vous de décider. ;) Tout répondant est heureux si sa réponse est acceptée;) – jezrael

+0

merci pour votre gentillesse .. –

3

En utilisant pandas 'pd.MultiIndex.from_product:

df = pd.DataFrame(index=pd.MultiIndex.from_product([name_list, food_list])) 
df.to_excel("c:\\name_food.xls", sheet_name="Sheet1") 

Le fichier Excel contient maintenant:

Jack Ice-cream 
    Jack  Mango 
    Jack  Apple 
    Jack  Cake 
David Ice-cream 
David  Mango 
David  Apple 
David  Cake 
    Andy Ice-cream 
    Andy  Mango 
    Andy  Apple 
    Andy  Cake 

Si vous voulez que le format exact comme indiqué dans votre image, vous pouvez réinitialiser l'index, puis convertir lignes dupliquées pour vider des chaînes.

df = pd.DataFrame(index=pd.MultiIndex.from_product(\ 
           [name_list, food_list])).reset_index() 
df['level_0'].loc[df['level_0'].duplicated()] = '' 
df.to_excel("c:\\name_food.xls", sheet_name="Sheet1", index=False, columns=False) 

Le fichier Excel ressemblera à ceci:

 Jack Ice-cream 
       Mango 
       Apple 
       Cake 
    David Ice-cream 
       Mango 
       Apple 
       Cake 
    Andy Ice-cream 
       Mango 
       Apple 
       Cake 
+1

@COLDSPEED, merci pour le grand partage des connaissances. C'est certainement avantageux pour tout le monde! Souhaitez-vous que je choisis la solution utilisée xlrd la réponse? –

+1

@MarkK C'est un peu décevant de vous entendre dire ça. Il arrive toujours que les gens qui disent «j'aimerais voir une réponse dans xxx ou yyy» ne considèrent jamais sérieusement les solutions dites xxx ou yyy. De toute évidence, votre vote est votre choix et je ne peux pas vous dire quoi faire, mais c'est un manque de respect pour mon temps et celui de jezrael, si vous le faites. Cela dit, c'est à vous de décider. –

+1

@MarkK En outre, si vous me demandiez mon avis sur votre choix d'un point de vue technique, je dirais ... "avez-vous perdu la tête?!" ... si vous avez une voiture, je vois aucun point conduire un scooter autour. –