Python / Pandas / DataFrame /迭代/遍历行,找到一个值,记下索引,然后从该索引开始,找到另一个值

时间:2018-12-19 06:14:44

标签: python pandas loops

A。我有一个数据框,其中顺序很重要。

import pandas as pd
inp = [{'c1':1,'c2':111123}, {'c1':2, 'c2':1001}, {'c1':3,'c2':11032}, {'c1':4,'c2':11044}, {'c1':5,'c2':11012}, {'c1':6, 'c2':100156}]
df = pd.DataFrame(inp)
print (df)

   c1      c2
0   1  111123
1   2    1001
2   3   11032
3   4   11044
4   5   11012
5   6  100156

B。我想在该数据帧中搜索一个值,从该行返回一些值,然后根据该值的索引,我要搜索从该索引处开始的该数据帧的其余部分,并找到另一个值并执行相同的操作而忽略此索引之前发生的所有值

上述数据框的示例:

  1. 从c2列中查找值11032,在该索引处为c1打印值

  2. 从在c2列中找到11032的索引开始,从c2列中搜索11012,在该索引处为c1打印值

谢谢。

2 个答案:

答案 0 :(得分:1)

使用1==)作为布尔掩码,并通过eq获取第一个True的第一个索引:

通知

如果两个值都在“序列”中,则解决方案有效,第二个值在c2中的第一个值之后。

a = df['c2'].eq(11032).idxmax()
print (a)
2

b = df.loc[a:, 'c2'].eq(11012).idxmax()
print (b)
4

通过带有theis索引的值返回元组列表的更一般的解决方案,如果没有第一个值匹配,则返回空列表。如果第二,第三...值不匹配,则仅返回所有匹配对:

def get_vals(vals):
    out = []
    idx = 0
    for x in vals:
        m = df.loc[idx:, 'c2'].eq(x)
        if m.any():
            idx = m.idxmax()
            out.append((x, idx))
        else:
            return out
    return out

print (get_vals([11032, 11012]))
[(11032, 2), (11012, 4)]
print (get_vals([10, 11012]))
[]
print (get_vals([11032, 10]))
[(11032, 2)]
print (get_vals([10, 11012, 100156]))
[]
print (get_vals([11032, 11012, 100156]))
[(11032, 2), (11012, 4), (100156, 5)]
print (get_vals([11032, 11012, 10]))
[(11032, 2), (11012, 4)]
print (get_vals([11032, 11012, 111123]))
[(11032, 2), (11012, 4)]

答案 1 :(得分:1)

编写一个通用搜索功能,该功能使用df.truncate

def search(df,val,prev_index):
    df_tmp = df.truncate(before=prev_index)
    idx = df.index[df['c2'] == val].tolist()[0]
    return df.iloc[idx]['c1'],idx

现在

print(search(df,1001,0)) 

将返回

  

(2,1)

print(search(df,100156,1)  #you can save idx values i.e. here 1 to a variable and reuse them !

将返回

  

(6,5)