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

时间:2020-06-03 10:16:07

标签: 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, 4]    [2,8] 
3        [5, 8]    [5,8]

我已经尝试过的以下代码不起作用:

dt["B"] =[np.min(dt.A), np.max(dt.A)]

4 个答案:

答案 0 :(得分:10)

赞:

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)]) 

答案 1 :(得分:10)

您可以创建DataFrame,然后通过DataFrame.agg创建最小值和最大值,转换为列表,如果要求没有循环(Apply是幕后的循环),则分配回来:

df = pd.DataFrame(dt.A.tolist())
dt['B'] = df.agg(['min','max'], axis=1).astype(int).values.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]

如果没问题,则用list comprehension循环另一个解决方案,它应该像apply一样快,取决于实际数据:

dt['B'] =  [[min(x), max(x)] for x in dt.A]

答案 2 :(得分:6)

只需使用explode替代:

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]

答案 3 :(得分:4)

对dt.A中的排序值使用列表推导

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

enter image description here

相关问题