Python Pandas是否可以在生成的系列中找到最大值而无需将系列存储到内存中?

时间:2016-05-09 19:59:38

标签: python pandas

我正在尝试在数据框中的列上找到计算的最大值。为此,我正在创建计算列,然后在其上调用max()

df['two'] = df['one']/df['one'].index maximum = df['two'].max()

这是一个缓慢的操作,我想知道是否可以通过避免计算列的内存使用来优化它,并且只是在保持跟踪其最大值的同时计算列。我可以用香草蟒蛇做到这一点,但我想要大熊猫的效率。

感谢任何可以帮助我的人!

3 个答案:

答案 0 :(得分:2)

我们可以尝试作弊,但我们需要知道确切的公式/算法。

在您的示例中,可以在不存储列的情况下完成:

maximum = (df.a/df.index).max()

如果计算更复杂,可以使用.assign()方法:

maximum = df.assign(two=df.a/df.index)['two'].max()

测试:

In [19]: df
Out[19]:
    a  b  c
0   0  9  3
1   7  6  5
2   4  5  8
3   0  4  3
4   7  4  5
5   0  9  9
6   7  5  2
7   4  4  4
8   1  3  3
9   3  1  3
10  6  6  1
11  8  4  0
12  6  2  9
13  4  1  0
14  8  5  9

In [20]: df.assign(two=df.a/df.index)['two'].max()
Out[20]: 7.0

In [21]: (df.a/df.index).max()
Out[21]: 7.0

答案 1 :(得分:0)

问题在于你牺牲了内存效率以提高处理效率。

你可以写一个循环。

maximum = np.nan
for i in range(len(df.a)):
    if pd.isnull(maximum):
        maximum = df.a[i] / df.index[i]
    else:
        maximum = max(maximum, df.a[i] / df.index[i])

答案 2 :(得分:0)

这应该是非常有效的内存。它使用iterrowsmax的生成器。

np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))

df
Out[107]: 
          a         b         c
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
2  0.950088 -0.151357 -0.103219
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

>>> max(row.a / idx for  idx, row in df.iterrows() if idx)
2.2408931992014578

if idx用于删除分母为零或无的实例。