【发布时间】:2018-07-11 06:34:13
【问题描述】:
我有一个熊猫系列说
import pandas as pd
a = pd.Series([
[1, 2, 3, 4, 5],
[6, 7, 8, 3, 334],
[333, 4, 5, 3, 4]
])
我想在所有列表中找到最大的元素,即 334,有什么简单的方法吗?
【问题讨论】:
我有一个熊猫系列说
import pandas as pd
a = pd.Series([
[1, 2, 3, 4, 5],
[6, 7, 8, 3, 334],
[333, 4, 5, 3, 4]
])
我想在所有列表中找到最大的元素,即 334,有什么简单的方法吗?
【问题讨论】:
这是一种方式:
max(max(i) for i in a)
功能变体:
max(map(max, a))
只计算一个max的替代方法:
from toolz import concat
max(concat(a))
为了好玩,下面是一些基准测试。惰性函数 concat 和优化的 map / 列表解析做得最好,然后是 numpy 函数,pandas 方法通常更差,聪明的 sum 应用程序最后。
import numpy as np
from toolz import concat
import pandas as pd
a = pd.Series([list(np.random.randint(0, 10, 100)) for i in range(1000)])
# times in ms
5.92 max(concat(a))
6.29 max(map(max, a))
6.67 max(max(i) for i in a)
17.4 max(x for l in a for x in l)
19.2 np.max(a.tolist())
20.4 np.concatenate(a.values).max()
64.6 pd.DataFrame(a.values.tolist()).max().max()
373 np.max(a.apply(pd.Series).values)
672 max(sum(a,[]))
696 max(a.sum())
【讨论】:
concat :)。
到数据框
pd.DataFrame(a.values.tolist()).max().max()
Out[200]: 334
或numpy.concatenate
np.concatenate(a.values).max()
Out[201]: 334
或者
max(sum(a,[]))
Out[205]: 334
【讨论】:
选项 1
仅当元素实际上是 list 时才有效。这是因为sum 连接列表。这也可能非常缓慢。
max(a.sum())
334
选项 2max 的最小两层应用
max(map(max, a))
334
选项 3
仅当所有列表长度相同时才有效
np.max(a.tolist())
334
选项 4max 在未绕线发电机上的一种应用
max(x for l in a for x in l)
334
【讨论】:
使用 np.max 的另一个答案:
import numpy as np
np.max(a.apply(pd.Series).values)
Out[175]: 334
【讨论】: