Python 如何获取列中列表的最大值和最小值?

Python 如何获取列中列表的最大值和最小值?,python,pandas,list,Python,Pandas,List,鉴于此,我有一个数据帧,如下所示: import pandas as pd import numpy as np dict = { "A": [[1,2,3,4],[3],[2,8,4],[5,8]] } dt = pd.DataFrame(dict) 我希望在B列中有每行的最大值和最小值。我最喜欢的输出是: A B 0 [1, 2, 3, 4] [1,4] 1 [3] [3,3] 2 [2, 8

鉴于此,我有一个数据帧,如下所示:

import pandas as pd
import numpy as np

dict = {
        "A": [[1,2,3,4],[3],[2,8,4],[5,8]]
}

dt = pd.DataFrame(dict)
我希望在B列中有每行的最大值和最小值。我最喜欢的输出是:

              A    B
0  [1, 2, 3, 4]    [1,4]
1           [3]    [3,3] 
2     [2, 8, 4]    [2,8] 
3        [5, 8]    [5,8]
我已经尝试了以下代码,但它不起作用:

dt["B"] =[np.min(dt.A), np.max(dt.A)]
像这样:

In [1592]: dt['B'] = dt.A.apply(lambda x: [min(x), max(x)])     
In [1593]: dt                                   
Out[1593]: 
              A       B
0  [1, 2, 3, 4]  [1, 4]
1           [3]  [3, 3]
2     [2, 8, 4]  [2, 8]
3        [5, 8]  [5, 8]
正如@Ch3steR所建议的,使用
map
,因为它更快:

dt['B'] = dt.A.map(lambda x: [min(x), max(x)]) 

您可以创建
DataFrame
,然后通过将最小值和最大值转换为列表,并在需求为无循环时分配回(
Apply
是引擎盖下的循环):

如果使用
列表理解
的另一个解决方案没有问题,它应该更快,如
应用
,取决于实际数据:

dt['B'] =  [[min(x), max(x)] for x in dt.A]
只是另一种选择:



对dt.A中的排序值使用列表理解

 dt['B']= [[row[0], row[-1]] for row in dt.A.map(lambda x: sorted(x))]

我的意思是,在这个问题上类似于一个循环:然而,
apply
是一个很好的解决方案。在所有的解决方案中,
[[min(x),max(x)]对于dt.a中的x]
是最快的+1@Ch3steR它比杰兹的第一个解决方案快吗?我没想到会这样。@Erfan是的,我
timeit
所有的解决方案。list comp是最快的解决方案,比第二快的解决方案快10倍。可能是我的分析不公平,因为我没有用大列表和大数据帧测试它。啊,好的,我认为应该在相当大的数据上进行比较,以查看方法的效率。@如果有大数据,我将使用一些自定义函数来计算
min
max
,在一次过程中可能使用
cython
。在这里,我们在同一个iterable上迭代两次,当它可以在一个过程中完成时,如果列表很小,那么无论如何都不重要。我同意用大数据测试更好。
dt.A.map(…)
pd.Series快一点。应用
as
pd.Series.map
用于元素计算。而
map
大约快了20-30µs,但速度也不太快。
dt['B'] = (dt['A'].explode().astype(int).groupby(level=0).agg(['min','max'])
           .to_numpy().tolist())
print(dt)
              A       B
0  [1, 2, 3, 4]  [1, 4]
1           [3]  [3, 3]
2     [2, 8, 4]  [2, 8]
3        [5, 8]  [5, 8]
 dt['B']= [[row[0], row[-1]] for row in dt.A.map(lambda x: sorted(x))]