Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大熊猫高效的列内操作_Python_Python 3.x_Pandas_Dataframe_Vectorization - Fatal编程技术网

Python 大熊猫高效的列内操作

Python 大熊猫高效的列内操作,python,python-3.x,pandas,dataframe,vectorization,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

给定一个
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}

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

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

代码:

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}
结果:

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}