Pandas:使用德语元音变音符、大小写和数字对数据帧进行正确排序



我有这个数据帧(所有字符串(:

to_sort data
0     Belgien   a2
1      Zürich   b2
2    dänemark   c2
3          20   d2
4         100   e2
5  Österreich   f2

我想对它进行排序,使德语元音变音符正确,小写和数字正确:

to_sort data
3          20   d2
4         100   e2
0     Belgien   a2
2    dänemark   c2
5  Österreich   f2
1      Zürich   b2

这是我生成数据帧和结果的代码:

import io, pandas as pd
t = io.StringIO("""
to_sort|data
Belgien|a2
Zürich|b2
dänemark|c2
20|d2
100|e2
Österreich|f2""")
df = pd.read_csv(t, sep='|')
df = df.sort_values(by='to_sort', key=lambda col: col.str.lower().str.normalize('NFD'))

结果几乎是正确的,但数字排序错误,20应该在200之前:

to_sort data
4         100   e2
3          20   d2
0     Belgien   a2
2    dänemark   c2
5  Österreich   f2
1      Zürich   b2

如何在保持所有其他特性的同时修复数字排序

使用DataFrame.sort_values:中最后一个样本数据的解决方案

from natsort import index_natsorted
f = lambda col: np.argsort(index_natsorted(col.str.lower().str.normalize('NFD')))
df = df.sort_values(by='to_sort', key=f )
print (df)
to_sort data
3          20   d2
4         100   e2
0     Belgien   a2
2    dänemark   c2
5  Österreich   f2
1      Zürich   b2

只需附加.str.pad(max(col.str.len()):

key = lambda col: col.str.lower().str.normalize('NFD').str.pad(max(col.str.len()))
df = df.sort_values(by='to_sort', key=key)
print(df)
# Output
to_sort data
3          20   d2
4         100   e2
0     Belgien   a2
1      Zürich   b2
2    dänemark   c2
5  Österreich   f2

最新更新