python - 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 |
解决方案
我认为您可以通过迭代由 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
推荐阅读
- python - Python:在行的列中以 numpy 和自定义格式保存 csv
- generics - Kotlin:通过类进行铸造
使用时检查,但它显示“类型不匹配”。 - angular - ngx-bootstrap 下拉菜单在移动视图中嵌套子菜单
- javascript - 使用 animate.css 在第一个动画后 6 秒重复相同的动画 [已编辑]
- git - 如何更改已关闭/合并的拉取请求的基本分支?
- python - 在 Python 中的字符串系列中替换不正确单词的有效方法
- android - 使用 Google play 游戏服务 sdk 登录失败
- android - 通过覆盖 View Pager 的 PageTransformer 类的 transformPage(View view, float position) 方法自定义动画
- android - 尝试将此 Mockito 测试转换为 Mockk 会导致错误
- mysql - 有什么方法可以使用“ORDER BY”对这个表进行排序?