我正在尝试在数据框中的列上找到计算的最大值。为此,我正在创建计算列,然后在其上调用max()
。
df['two'] = df['one']/df['one'].index
maximum = df['two'].max()
这是一个缓慢的操作,我想知道是否可以通过避免计算列的内存使用来优化它,并且只是在保持跟踪其最大值的同时计算列。我可以用香草蟒蛇做到这一点,但我想要大熊猫的效率。
感谢任何可以帮助我的人!
答案 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)
这应该是非常有效的内存。它使用iterrows
和max
的生成器。
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
用于删除分母为零或无的实例。