首页 > 解决方案 > python - 排列带有链接列的excel文件

问题描述

有一个超过 2000 行的 Excel 文件,但如下所示:

一个 C D
AA 12 AA 22
AA 13 AA 23
AA 14 AA 24
抄送 17 DD 1.4
抄送 18 DD 1.2
抄送 19 DD 13
DD 1.2
DD 1.1
DD 1.3

AB 列和 CD 列是相连的。我如何对列 A 和 C 进行排序,并且它们前面的行以相同的顺序放置在同一行中。最终的 Excel 文件应如下所示:

一个 C D
AA 12 AA 22
AA 13 AA 23
AA 14 AA 24
抄送 17
抄送 18
抄送 19
DD 1.2 DD 1.4
DD 1.1 DD 1.2
DD 1.3 DD 13

标签: pythonopenpyxl

解决方案


我认为您可以通过迭代由 A 和 C 列中的值定义的完整组集来完成您需要的工作,并且对于每个组,您希望连接原始数据集左右两半的相应数据帧。

你可以使用 pandas read_excel() 读入你的数据,在你对它进行排序之后,你可以使用 DataFrame.to_excel() 将其写回。

要了解如何对数据进行排序,我们首先制作一个玩具数据集,在 A 列和 C 列中包含不同数量的对应项目(也允许项目出现在 A 或 C 中,但不能同时出现在两者中)。

import pandas as pd
original_df = pd.DataFrame.from_records([['AA', 12, 'AA', 22],
                                         ['AA', 13, 'DD', 1.4],
                                         ['CC', 17, 'DD', 1.5],
                                         ['DD', 1.3, '', '']],
                                        columns=['A', 'B', 'C', 'D'])
original_df

    A     B   C    D
0  AA  12.0  AA   22
1  AA  13.0  DD  1.4
2  CC  17.0  DD  1.5
3  DD   1.3  

现在我们拉出数据的左右两半(AB 和 CD 列),列出由 A 和 C 列中的值标识的所有组,并列来自左右两半的相应数据帧,并附加它们全部一起。

# Get left and right halves, dropping blanks.
left_df = original_df[['A', 'B']].query('A != ""')
right_df = original_df[['C', 'D']].query('C != ""')

# Build sorted list of unique values from original columns A and C.
groups = list(set(left_df.iloc[:,0]) | set(right_df.iloc[:,0]))
groups.sort()

# Assemble list of dataframes combining corresponding left-right data.
dfpairs = [pd.concat([left_df[left_df.A==g].reset_index(drop=True), 
                      right_df[right_df.C==g].reset_index(drop=True)],
                     axis='columns') for g in groups]

# Append all the dataframes together.
sorted_df = pd.concat(dfpairs, axis='index', ignore_index=True).fillna('')
sorted_df

    A    B   C    D
0  AA   12  AA   22
1  AA   13         
2  CC   17         
3  DD  1.3  DD  1.4
4           DD  1.5

推荐阅读