使用Python/Pandas将多索引数据写入Excel文件

3

我想创建一个Excel电子表格,并为每个可变量插入相同数量的行。理想的结果应该看起来像图片中的A列和B列。

到目前为止,我只能为1个名称(D列和E列)插入,不知道如何对其余部分进行适当的枚举。

name and food

这是我所拥有的:

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")

我该如何做到普及化?谢谢。


1
为什么这被标记为pandas?你甚至没有导入它。 - cs95
@COLDSPEED,我想Pandas可以在这里施展魔法。 :) - Mark K
1
除非您已经安装了pandas并且认真考虑使用其他人提供的解决方案,否则请求pandas解决方案是没有意义的。如果您已经做好了这些准备,那就没问题了。 - cs95
2个回答

4

你可以使用numpy.tilenumpy.repeat创建DataFrame,随后在a列中去除重复值:

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

使用列表推导式的另一种解决方案:

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

最后写入 to_excel:

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

谢谢!这绝对是学习中的超级奖励。您介意我选择使用xlrd解决方案吗? - Mark K
1
由你决定。 ;) 如果采纳了他的答案,每个回答者都会很高兴 ;) - jezrael

3

类似以下代码应该可以正常工作:

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")

重要的部分是:
write_table.write(i * len(food_list), 0, name_list[i])

您说名称应该写在0、4、8、12行...

此外,部分

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

将食品按照相应的部分,根据行号逐行增加。


太棒了!想得真好。感谢您的帮助。顺便问一下,如果我选择 COOLSPEED 的答案,你介意吗? - Mark K
慷慨!它是你的。 - Mark K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接