【问题标题】:How to get maximum and minimum of a list in column?如何获取列中列表的最大值和最小值?
【发布时间】:2020-09-22 00:10:17
【问题描述】:

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

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

【问题讨论】:

标签: python pandas list


【解决方案1】:

像这样:

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

【讨论】:

  • dt.A.map(...)pd.Series.apply 快一点,因为pd.Series.map 是为逐元素计算而设计的。 map 虽然快了大约 20-30 微秒,但速度并不快。
【解决方案2】:

您可以创建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]

【讨论】:

  • 在所有解决方案中,[[min(x), max(x)] for x in dt.A] 是最快的。 +1
  • @Ch3steR 是否比 jez 的第一个解决方案更快?我没想到。
  • @Erfan 是的,我timeit 所有的解决方案。 list comp 比第二快的解决方案快 10 倍。可能是我的分析可能不公平,因为我没有使用大型列表和大型 DataFrame 对其进行测试。
  • 啊好吧,我认为应该对相当大的数据进行比较,以了解方法的效率。
  • @Erfan 对于大数据,我会使用一些自定义函数来计算minmax 可能会使用cython。在这里,我们在同一个可迭代对象上迭代两次,如果它可以一次完成,并且如果列表很小,无论如何都无关紧要。我同意使用大数据进行测试更好。
【解决方案3】:

只是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]

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2021-09-17
      • 2021-12-04
      • 2010-11-23
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      相关资源
      最近更新 更多