Pandas小技巧,计算数字最大的那个列
蚂蚁学Python
共 2273字,需浏览 5分钟
·
2021-12-02 16:44
群里一个粉丝问了一个问题:
这个问题比较有趣,如果对pandas了解深入的话,一行代码就可以搞定:
代码粘贴如下:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({})
In [5]: import numpy as np
In [6]: df = pd.DataFrame(np.random.randn(10, 5), columns=list("abcde"))
In [7]: df
Out[7]:
a b c d e
0 0.096833 0.586116 2.095418 0.315111 -1.608427
1 0.865282 1.515651 0.640481 0.307134 0.904820
2 -0.858427 0.898042 -0.053222 0.754531 0.698137
3 0.396940 0.672170 0.540039 0.208133 1.180216
4 -0.088589 -0.667510 0.529450 0.721198 -0.731656
5 0.050982 0.054899 -1.441577 0.166684 0.796898
6 -1.478824 -0.535030 0.757314 -1.641352 1.981968
7 -0.158402 0.182258 1.073073 -0.064057 0.717734
8 0.172994 0.559067 0.600873 0.748483 0.770458
9 1.595864 -1.583323 0.254628 -1.359222 -0.314586
In [8]: df["f"] = df.apply(lambda row :
sorted(dict(row).items(), key=lambda x : x[1])[-1][0],axis=1)
In [9]: df
Out[9]:
a b c d e f
0 0.096833 0.586116 2.095418 0.315111 -1.608427 c
1 0.865282 1.515651 0.640481 0.307134 0.904820 b
2 -0.858427 0.898042 -0.053222 0.754531 0.698137 b
3 0.396940 0.672170 0.540039 0.208133 1.180216 e
4 -0.088589 -0.667510 0.529450 0.721198 -0.731656 d
5 0.050982 0.054899 -1.441577 0.166684 0.796898 e
6 -1.478824 -0.535030 0.757314 -1.641352 1.981968 e
7 -0.158402 0.182258 1.073073 -0.064057 0.717734 c
8 0.172994 0.559067 0.600873 0.748483 0.770458 e
9 1.595864 -1.583323 0.254628 -1.359222 -0.314586 a
解释一下这个代码:
1、df.apply
df.apply(function, axis=1)
这个方式,可以按行遍历df,对每一行使用function函数,这个function的参数是一个series,可以当做字典使用;
2、items
dict(row).items()
可以将row这个series变成一个字典。字典的items(),那就是[(key, value), (key, value)]这样的形式,结果形如:[ ('c', 2), ('b', 1), ('a', 3')]
3、sorted
sorted(dict(row).items(), key=lambda x : x[1])
这句,我们将字典进行了排序,使用的KEY是每个元素的第二个子元素,即原始字典的value,注意,默认是升序排列,结果形如:[('b', 1), ('c', 2), ('a', 3')]
4、sorted(xx)[-1]
sorted(dict(row).items(), key=lambda x : x[1])[-1]
这一句后面加了个[-1],因为是升序排列,所有这里取到了最大的值,例如('a', 123)
5、sorted(xx)[-1][0]
sorted(dict(row).items(), key=lambda x : x[1])[-1][0]
这时候,返回了('a', 123)的第0个元素,即列名"a"
这个代码做了比较简化的写法,大家可以思考下。
欢迎关注本公众号,持续分享Python、Pandas小案例
评论