Mac*_*kan 3 python sorting dataframe natsort pandas
我在熊猫中有这些数据
data = [
['ID', 'Time', 'oneMissing', 'singleValue', 'empty', 'oneEmpty'],
['CS1-1', 1, 10000, None, None, 0],
['CS1-2', 2, 20000, 0.0, None, 0],
['CS1-1', 2, 30000, None, None, 0],
['CS1-2', 1, 10000, None, None, None],
['CS1-11', 1, None, 0.0, None, None],
['CS1-2', 3, 30000, None, None, None]
]
Run Code Online (Sandbox Code Playgroud)
我尝试按 ID 和时间列排序,所以结果应该是这样的
'CS1-1', 1, 10000, None, None, 0
'CS1-1', 2, 30000, None, None, 0
'CS1-2', 1, 10000, None, None, None
'CS1-2', 2, 20000, 0.0, None, 0
'CS1-2', 3, 30000, None, None, None
'CS1-11', 1, None, 0.0, None, None
]
Run Code Online (Sandbox Code Playgroud)
我正在使用 Pandas 数据框进行排序,也尝试与 natsort 一起使用,但我无法让它工作。要么我得到索引包含重复项的错误(我使用 ID 作为索引),要么它按字符串值排序。
这里的 ID 只是一个例子。我不知道它将是什么格式,可能是 NUMBER-LETTER 或 NUMBER LETTER NUMBER。我只需要将所有数字作为一个数字进行比较。我看过“natsort”,这似乎对数组是正确的。所以我认为应该可以使用它来对 ID 进行排序,然后重新索引数据。
我已经查看了多个这样的来源,但没有任何运气: 字母数字排序 Sort dataframes
使用str.extract
, sort_values
,然后使用索引重新索引df
。
idx = (df.assign(ID2=df.ID.str.extract(r'(\d+)$').astype(int))
.sort_values(['ID2', 'Time'])
.index)
df.iloc[idx]
ID Time oneMissing singleValue empty oneEmpty
0 CS1-1 1 10000.0 NaN None 0.0
2 CS1-1 2 30000.0 NaN None 0.0
3 CS1-2 1 10000.0 NaN None NaN
1 CS1-2 2 20000.0 0.0 None 0.0
5 CS1-2 3 30000.0 NaN None NaN
4 CS1-11 1 NaN 0.0 None NaN
Run Code Online (Sandbox Code Playgroud)
这是假设您的 ID 列遵循模式“XXX-NUMBER”。
万无一失的解决方案将涉及使用该natsort
模块,该模块擅长快速自然排序。用一点肘部润滑脂,我们可以对您的数据进行argsort。
from natsort import natsorted
idx, *_ = zip(*natsorted(
zip(df.index, df.ID, df.Time), key=lambda x: (x[1], x[2])))
df.iloc[list(idx)]
ID Time oneMissing singleValue empty oneEmpty
0 CS1-1 1 10000.0 NaN None 0.0
2 CS1-1 2 30000.0 NaN None 0.0
3 CS1-2 1 10000.0 NaN None NaN
1 CS1-2 2 20000.0 0.0 None 0.0
5 CS1-2 3 30000.0 NaN None NaN
4 CS1-11 1 NaN 0.0 None NaN
Run Code Online (Sandbox Code Playgroud)
使用 PyPi 安装:pip install natsort
.
归档时间: |
|
查看次数: |
1424 次 |
最近记录: |