如何有效地净化熊猫数据框?

时间:2019-05-20 06:18:20

标签: python pandas

我很难用正确的词来表达我的问题,所以谢谢您阅读我的问题。

我有一个数据框,它有两列highlow,它们记录了  较高和较低的值。

例如:

     high   low
0     NaN   NaN
1   100.0   NaN
2     NaN  50.0
3   110.0   NaN
4     NaN   NaN
5   120.0   NaN
6   100.0   NaN
7     NaN   NaN
8     NaN  30.0
9     NaN   NaN
10    NaN  20.0
11    NaN   NaN
12  110.0   NaN
13    NaN   NaN

我想合并连续的(在同一侧),并保留最高的(最低)。

“连续的”表示high列中两个值之间的low列中的值,或{{1}中两个值之间的low列中的值}}列

应该合并索引high35的高值,索引6的最大值(值5)应该合并被留下。

索引1208的低值应合并,索引10的最低值(值10)应合并。

结果是这样的:

20

我试图编写一个for循环来处理数据,但是当数据很大(超过10,000个)时,速度非常慢。

代码是:

     high   low
0     NaN   NaN
1   100.0   NaN
2     NaN  50.0
3     NaN   NaN
4     NaN   NaN
5   120.0   NaN
6     NaN   NaN
7     NaN   NaN
8     NaN   NaN
9     NaN   NaN
10    NaN  20.0
11    NaN   NaN
12  110.0   NaN
13    NaN   NaN

有什么有效的方法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

对于像这样的面向行的迭代处理,熊猫通常做得不好,或者更确切地说根本没有效率。但是您始终可以直接处理基础的numpy数组:

import pandas as pd
import numpy as np

data=pd.DataFrame(dict(high=[None,100,None,110,None,120,100,None,None,None,None,None,110,None],
                    low=[None,None,50,None,None,None,None,None,30,None,20,None,None,None]))

npdata = data.values
flag = None
flag_index = None
for i in range(len(npdata)):
    if not np.isnan(npdata[i][0]):
        if flag == 'flag_high':
            if npdata[i][0] > npdata[flag_index][0]:
                npdata[flag_index][0] = np.nan
                flag_index = i
            else:
                npdata[i][0] = np.nan
        else:
            flag = 'flag_high'
            flag_index = i
    elif not np.isnan(npdata[i][1]):
        if flag == 'flag_low':
            if npdata[i][1] < npdata[flag_index][1]:
                npdata[flag_index][1] = np.nan
                flag_index = i
            else:
                npdata[i][1] = np.nan
        else:
            flag = 'flag_low'
            flag_index = i

在我的测试中,速度快了将近10倍。

数据帧越大,增益越高:在1500行中,直接使用numpy数组的速度快30倍。