看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例通过 pandas 的高阶函数应用来解决日常数据的处理问题。本需求有三个列,每个列为此列对应的顺序数字,最终需要按照顺序数字将这些列名排列显示。
原始数据以及想要的结果数据如下:
# 原数据
'''
a b c
1 2 3
3 2 1
3 1 2
'''
# 结果数据
'''
a->b->c
c->b->a
b->c->a
'''
比如第一行的值分别是1、2、3,所以他的顺序是 abc;第二行是 3、2、1,所以他的顺序是 cba;第三行是 3、1、2,所以他的顺序是 bca。最终需要将这些顺序列名用箭头连接起来。
解决这个问题的思路是先将这份数据载入到 pandas 的 DataFrame, 然后每行构造为一个字典,这个字典以列名为键,单元格值为键的值。 由于字典的值代表的是键的顺序, 我们需要按照字典值进行排序, 最后把字典的键用箭头连接起来。
数据载入到 pandas 的 DataFrame:
df = pd.read_clipboard()
df
'''
a b c
0 1 2 3
1 3 2 1
2 3 1 2
'''
将每行转为 列名->单元值 形式的字典:
df.agg(dict, axis=1)
'''
0 {'a': 1, 'b': 2, 'c': 3}
1 {'a': 3, 'b': 2, 'c': 1}
2 {'a': 3, 'b': 1, 'c': 2}
dtype: object
'''
对字典依据值排序:
(
df.agg(dict, axis=1)
# .map(lambda d:sorted(d,key=lambda x:d[x]))
.map(lambda d: sorted(d, key=d.get))
)
'''
0 [a, b, c]
1 [c, b, a]
2 [b, c, a]
dtype: object
'''
用箭头连接字典,字典连接元素时默认取字典的键名:
(
df.agg(dict, axis=1)
.map(lambda d: sorted(d, key=d.get))
.agg('->'.join)
)
'''
0 a->b->c
1 c->b->a
2 b->c->a
dtype: object
'''
这样就完成了需求。
(完)
更新时间:2024-08-18 15:55:33 标签:pandas python 排序