我在排序我的标题时遇到了问题,它显示了当年发生的所有会议,而不是转移到下一年(M是会议):

给定数据框架:

Meeting     M1/2023  M1/2024  M1/2025  M1/2026  M2/2023  M2/2024  M2/2025  M2/2026  M3/2023  M3/2024 (...)
Date                                                                        
2023-01-02    13.75  11.7500      NaN      NaN    13.75  11.2500      NaN   NaN    13.75     10.9375 (...)
2023-01-03    13.75  11.7500      NaN      NaN    13.75  11.2500      NaN   NaN    13.75     10.8750 (...)
2023-01-04    13.75  11.8125      NaN      NaN    13.75  11.4375      NaN   NaN    13.75     11.0000 (...)
2023-01-05    13.75  11.7500      NaN      NaN    13.75  11.3750      NaN   NaN    13.75     11.0000 (...)

What the order should be:
M1/2023  M2/2023  M3/2023  M4/2023  M1/2024  M2/2024  M3/2024   M4/2024  M1/2025  M2/2025 (...)
Date
(...)

一开始我试图使用df. sort_values()重新排序,但结果是一样的.我的下一个步骤是将标题作为字符串,这样我就可以编辑数据并在会议编号前面添加年份,这样sort_valeus()就可以工作了:

headers_dict = {}

for i in df.columns:
    headers_dict[i] = i.split('/')[1]+'_'+i.split('/')[0]

输出:

{'M1/2023': '2023_M1',
 'M1/2024': '2024_M1',
 'M1/2025': '2025_M1',
 'M1/2026': '2026_M1',
 'M2/2023': '2023_M2',
 'M2/2024': '2024_M2',
 'M2/2025': '2025_M2', (...)}

这部分工作了,但是我不能把编辑过的字符串放回df(我试着在这里使用. reindex()),而不把我所有的数据都转换成NaN.我该怎么办?有办法吗?对不起,我的英语不好.

推荐答案

你有两个问题,你需要交换块的顺序,你需要使用自然排序.

我会用str.split,然后用natsort作为键:

from natsort import natsort_key

idx = (df.columns.to_series().str.split('/', expand=True)
         .sort_values(by=[1, 0], key=natsort_key).index
      )

out = df[idx]

输出:

            M1/2023  M2/2023  M3/2023  M1/2024  M2/2024  M3/2024  M1/2025  M2/2025  M1/2026  M2/2026
Date                                                                                                
2023-01-02    13.75    13.75    13.75  11.7500  11.2500  10.9375      NaN      NaN      NaN      NaN
2023-01-03    13.75    13.75    13.75  11.7500  11.2500  10.8750      NaN      NaN      NaN      NaN
2023-01-04    13.75    13.75    13.75  11.8125  11.4375  11.0000      NaN      NaN      NaN      NaN
2023-01-05    13.75    13.75    13.75  11.7500  11.3750  11.0000      NaN      NaN      NaN      NaN

假设另一个例子:

# input
  M1/2023 M1/2024 M2/2023 M2/2024 M10/2023 M10/2024
0     NaN     NaN     NaN     NaN      NaN      NaN

# output
  M1/2023 M2/2023 M10/2023 M1/2024 M2/2024 M10/2024
0     NaN     NaN      NaN     NaN     NaN      NaN

Python相关问答推荐

Pandas :多索引组

Python中MongoDB的BSON时间戳

多处理代码在while循环中不工作

三个给定的坐标可以是矩形的点吗

将jit与numpy linSpace函数一起使用时出错

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

如何获取numpy数组的特定索引值?

mypy无法推断类型参数.List和Iterable的区别

Python导入某些库时非法指令(核心转储)(beautifulsoup4."" yfinance)

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

为什么\b在这个正则表达式中不解释为反斜杠

Python—转换日期:价目表到新行

在Python中从嵌套的for循环中获取插值

如何在Python 3.9.6和MacOS Sonoma 14.3.1下安装Pyregion

mdates定位器在图表中显示不存在的时间间隔

提取数组每行的非零元素

如何在Python中将超链接添加到PDF中每个页面的顶部?

按条件添加小计列

如何在Pandas中用迭代器求一个序列的平均值?