Pandas中的自然排序

2024-06-28 20:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有熊猫的数据

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]
    ]

我尝试按ID和Time列排序,结果应该是

^{pr2}$

我正在使用pandas dataframe进行排序,也尝试过与natsort一起使用,但我无法使其工作。要么得到索引包含重复项的错误(我使用ID作为索引),要么它按字符串值排序。在

这里只是一个例子。我不知道它是什么格式,可能是数字字母或数字字母数字。我只需要把所有的数字作为一个数字来比较。我看过“natsort”,这似乎对数组是正确的。所以我认为应该可以使用它来对ID进行排序,然后重新索引数据。在

我看过很多类似的资料,但没有任何运气: Alphanumeric sortingSort dataframes


Tags: 数据noneiddatatime排序字母数字
3条回答

注意:此方法假设您希望按XABC-X形式的ID进行数字排序。

^{}支持按多个序列排序,并避免向数据帧添加额外的序列。此示例按ID后缀进行数字排序,然后按Time进行排序:

df = pd.DataFrame(data[1:], columns=data[0])

id_num = df['ID'].str.split('-').str[-1].astype(int)

df = df.iloc[np.lexsort((df['Time'], id_num))]

print(df)

       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

使用str.extractsort_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

这是假设您的ID列遵循模式“XXX-NUMBER”。在


一个防愚弄的解决方案将涉及使用^{}模块,它擅长于快速自然排序。再加一点润滑油,我们就可以整理你的数据了。在

^{pr2}$

使用PyPi安装:pip install natsort。在

我想你在找sort_values

df.sort_values(['ID','Time'])

注意:如果您希望CS1-11CS1-2之后(这不是标准的字符串顺序),您可能需要引入一个长度列,例如

^{pr2}$

相关问题 更多 >