大熊猫中的高效柱内操作

时间:2017-03-18 20:17:22

标签: python python-3.x pandas dataframe vectorization

鉴于pandas.DataFrame,列表和特殊值,我正在寻找一种优雅的方法:

  

在df的特定列中,每次遇到特殊值时,请检查系列中的前一个值是否在列表中。

如果,则返回此前一个值。

如果没有再返回一个值并检查它。

工作实施是:

ser = [1, 2, 0, 2, 3, 1, 4, 7, 2]
d = dict()
relevant =  [0,1]
df = pd.DataFrame([list(range(len(ser))), ser]).transpose()

for j in range(df.shape[0]):
    if df.iloc[j,1]==2:
        k=1
        while True:
            if df.iloc[j-k,1] in relevant:
                d[j] = df.iloc[j-k,1]
                break
            else:
                k+=1

这给出了:

d
{1: 1, 3: 0, 8: 1}

我知道我可以使用shift函数,但是当我使用它时,我有一个循环。我想知道什么是优雅的最佳方式,如果可能的话,速度没有循环。

1 个答案:

答案 0 :(得分:1)

我相信你至少需要一个循环,但你只需要一个循环。你所追求的是你看到哨兵时看到的最后一个相关值。因此,此代码会跟踪扫描哨兵时看到的最后一个值。

<强>代码:

marker = 2
relevant = {0, 1}
ser = [1, 2, 0, 2, 3, 1, 4, 7, 2]
d = dict()
last_found = None
for i, val in enumerate(ser):
    if val == marker:
        if last_found is not None:
            d[i] = last_found
    elif val in relevant:
        last_found = val

print(d)

<强>结果:

{8: 1, 1: 1, 3: 0}