【发布时间】:2021-12-25 17:24:39
【问题描述】:
我在使用 excel 文件对某些列和行中的数据进行分类时遇到问题,我需要将合并单元格排列到下一列作为 1 行,并且下一列像这张图片一样放在它们旁边:
输入:
乳制品输出:
总结:
首先我们取Dairy行,然后我们到Dairy前面的第二列,得到Dairy前面的数据,然后我们到第二列,在Milk to Mr. 1前面我们得到Butter to Mrs. 1 和 Butter to Mrs. 2 等等...
之后,我们要将其导出到输出图片中的 excel 文件中。
我编写了一个代码,它获取第一列数据并找到它前面的所有数据,但我需要更改它以便像输出图片中那样逐行获取数据:
import pandas
import openpyxl
import xlwt
from xlwt import Workbook
df = pandas.read_excel('excel.xlsx')
result_first_level = []
for i, item in enumerate(df[df.columns[0]].values, 2):
if pandas.isna(item):
result_first_level[-1]['index'] = i
else:
result_first_level.append(dict(name=item, index=i, levels_name=[]))
for level in df.columns[1:]:
move_index = 0
for i, obj in enumerate(result_first_level):
if i == 0:
for item in df[level].values[0:obj['index'] - 1]:
if pandas.isna(item):
move_index += 1
continue
else:
obj['levels_name'].append(item)
move_index += 1
else:
for item in df[level].values[move_index:obj['index'] - 1]:
if pandas.isna(item):
move_index += 1
continue
else:
obj['levels_name'].append(item)
move_index += 1
# Workbook is created
wb = Workbook()
# add_sheet is used to create sheet.
sheet1 = wb.add_sheet('Sheet 1')
style = xlwt.easyxf('font: bold 1')
move_index = 0
for item in result_first_level:
for member in item['levels_name']:
sheet1.write(move_index, 0, item['name'], style)
sheet1.write(move_index, 1, member)
move_index += 1
wb.save('test.xls')
感谢您的帮助!
【问题讨论】:
-
检查 'xlwings' 库,如果对您有用,将数据导入为 pandas 数据框,docs.xlwings.org/en/stable/datastructures.html
-
@LorenzoBassetti 我一开始就得到了熊猫数据框,但我在将数据排列成 2 列时遇到了问题
-
可能对 A1-A12 重复“日记”......然后从 A13 到 A18 等重复“水果”等可能很有用,这样您就可以简单地阅读该行。您正在使用的合并单元格基本上只是 Excel 的“视觉”技巧,但是 A1 的值为 'Diary' ,而 A2...A12 的值为“null”。我建议不要使用合并单元格。
-
@LorenzoBassetti basedata 是合并的单元格,我对此无能为力,所以您可以添加答案并添加代码以便我更好地理解您吗?
-
请问您可以分享您的示例 excel 文件吗?使用
networkx来解决这个问题。
标签: python python-3.x excel pandas dataset