gpt4 book ai didi

python - 按自定义方式对 Pandas 数据框进行排序

转载 作者:行者123 更新时间:2023-12-04 00:51:33 24 4
gpt4 key购买 nike

我已经尝试了很多以自己的方式对 DataFrame 列进行排序。但无法正确地做到这一点。所以请引用给定的代码,让我知道完成这项工作的附加语法是什么。

df = pd.DataFrame({'TC': {0: '1-1.1', 1: '1-1.2', 2: '1-10.1', 3: '1-10.2', 4: '1-2.1', 5: '1-2.1', 6: '1-2.2', 7: '1-20.1', 8: '1-20.2', 9: '1-3.1'}, 'Case': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J'}})
df.sort_values(["TC"], ascending=[True])
print (df)

这段代码没有给出想要的输出。我需要按以下排序的 Dataframe。

enter image description here

最佳答案

您可以提取数字并形成一个元组,然后对该系列进行排序并使用其索引重新索引 你原来的 DataFrame。

>>> df.reindex(
df['TC'].str.extractall('(\d+)')
.unstack().astype(int)
.agg(tuple, 1).sort_values()
.index
)

TC Case
0 1-1.1 A
1 1-1.2 B
4 1-2.1 E
5 1-2.1 F
6 1-2.2 G
9 1-3.1 J
2 1-10.1 C
3 1-10.2 D
7 1-20.1 H
8 1-20.2 I

您还可以在 sort_values 中使用 key 参数:

>>> df.sort_values('TC', 
key=lambda ser:
ser.str.extractall('(\d+)')
.unstack()
.astype(int).agg(tuple, 1)
)

如果 ID 始终包含三个部分,您可以在 非数字 字符上使用 Series.str.split expand=True,而不是 extractall,因此无需使用 unstack:

>>> df.sort_values('TC', 
key=lambda series:
series.str.split(r'\D+', expand=True)
.astype(int).agg(tuple,1)
)

时间:

>>> %timeit df.reindex(df['TC'].str.extractall('(\d+)').unstack().astype(int).agg(tuple, 1).sort_values().index)
2.95 ms ± 40.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit df.sort_values('TC', key=lambda ser: ser.str.extractall('(\d+)').unstack().astype(int).agg(tuple, 1))
2.91 ms ± 32.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit df.sort_values('TC', key=lambda series:series.str.split(r'\D+', expand=True).astype(int).agg(tuple,1))
1.6 ms ± 5.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

关于python - 按自定义方式对 Pandas 数据框进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66090077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com