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

Jef*_*eff 9 python list pandas

鉴于此,我有一个如下的数据框:

import pandas as pd
import numpy as np

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

dt = pd.DataFrame(dict)
Run Code Online (Sandbox Code Playgroud)

我希望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]
Run Code Online (Sandbox Code Playgroud)

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

dt["B"] =[np.min(dt.A), np.max(dt.A)]
Run Code Online (Sandbox Code Playgroud)

May*_*wal 11

像这样:

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]
Run Code Online (Sandbox Code Playgroud)

正如@Ch3steR 所建议的,map因为它更快,所以使用:

dt['B'] = dt.A.map(lambda x: [min(x), max(x)]) 
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 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]
Run Code Online (Sandbox Code Playgroud)

如果使用 循环另一个解决方案没有问题list comprehension,它应该更快,例如apply,取决于真实数据:

dt['B'] =  [[min(x), max(x)] for x in dt.A]
Run Code Online (Sandbox Code Playgroud)

  • 在所有解决方案中,“[[min(x), max(x)] for x in dt.A]”是最快的。+1 (2认同)

ank*_*_91 6

只是一个替代方案explode

dt['B'] = (dt['A'].explode().astype(int).groupby(level=0).agg(['min','max'])
           .to_numpy().tolist())
print(dt)
Run Code Online (Sandbox Code Playgroud)
              A       B
0  [1, 2, 3, 4]  [1, 4]
1           [3]  [3, 3]
2     [2, 8, 4]  [2, 8]
3        [5, 8]  [5, 8]
Run Code Online (Sandbox Code Playgroud)