python - 使用自定义顺序对熊猫中的列进行排序以获取未知数量的列
问题描述
我的 pandas DataFrame 中有以下列
DB_0, ISBN_0, ISSN_0, Title_0, e-ISBN_0, e-ISSN_, DB_1, ISBN_1, ISSN_1, Title_1, e-ISBN_1, e-ISSN_1 .... DB_n, ISBN_n, ISSN_n, Title_n, e-ISBN_n, e-ISSN_n
我想将其更改为自定义订单,如下所示:
Title_0, DB_0, ISSN_0, e-ISSN_0, ISBN_0, e-ISBN_0, Title_1, DB_1, ISSN_1, e-ISSN_1, ISBN_1, e-ISBN_1, ..... Title_n, DB_n, ISSN_n, e-ISSN_n, ISBN_n, e-ISBN_n
我怎样才能达到这个结果?我已经尝试了一切,但没有任何效果。试图在谷歌上搜索它,但没有找到答案。问题是我们不知道最后会有多少列。
解决方案
使用模板order
:
l = ['DB_0', ' ISBN_0', ' ISSN_0', ' Title_0', ' e-ISBN_0', ' e-ISSN_', ' DB_1', ' ISBN_1', ' ISSN_1', ' Title_1', ' e-ISBN_1', ' e-ISSN_1', ' DB_2', ' ISBN_2', ' ISSN_2', ' Title_2', ' e-ISBN_2', ' e-ISSN_2']
order = ["Title", "DB", "ISSN", "e-ISSN", "ISBN", "e-ISBN"]
new_columns = [
"{f}_{n}".format(f=f, n=n)
for n in range(int(max([x.split("_")[1] for x in l])) + 1)
for f in order
]
print(new_columns)
>>> ['Title_0', 'DB_0', 'ISSN_0', 'e-ISSN_0', 'ISBN_0', 'e-ISBN_0', 'Title_1', 'DB_1', 'ISSN_1', 'e-ISSN_1', 'ISBN_1', 'e-ISBN_1', 'Title_2', 'DB_2', 'ISSN_2', 'e-ISSN_2', 'ISBN_2', 'e-ISBN_2']
更新:解释
order
用作您要描述单个项目的特定字段顺序的模板。
现在,您的列由未知数量的项目组成。
我用这种不雅的方法找到了项目的数量:
int(max([x.split("_")[1] for x in l])) + 1
然后我使用列表推导循环遍历项目编号和字段(与我的列表顺序相同order
)以在代码中创建形式为“field_number”的字符串{f}_{n}
:
new_columns = [
"{f}_{n}".format(f=f, n=n)
for n in range(int(max([x.split("_")[1] for x in l])) + 1)
for f in order
]
推荐阅读
- java - 线程“main”中的异常 java.lang.NoClassDefFoundError: kotlin/KotlinPackage & 由:java.lang.ClassNotFoundException: kotlin.KotlinPackage
- android - 从 android 应用推送新的 java 对象后,在 firebase 数据库中找不到我的数据
- python - 如何将 Python 和 Kivy 合并为一个项目
- ios - 如何快速在 SideMenu 中提供设置(背景视图的 alpha 值)?
- reactjs - Facebook SDK 登录/注销 ngrok
- google-finance - 1 月 1 日计算时出现 Google 财务错误
- python - 将每日数据重新采样到每小时数据框并复制内容
- r - 在 R 中使用带有二次项和交互虚拟变量的边距命令
- compiler-errors - 特征方法中的 Rust Lifetime 不匹配
- angular - How do you make a request with matrix parameters in the URI to a backend when using Angular's HttpClient?