Python / Pandas / DataFrame / Итерация / Итерация по строкам, поиск значения, индекс заметки, затем, начиная с этого индекса, поиск другого значения - PullRequest
0 голосов
/ 19 декабря 2018

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. Найти значение 11032 из столбца c2, вывести значение этого индекса для c1

  2. Начиная с индекса, где было найдено 11032 из столбца c2, найдите 11012 из столбца c2, выведите значение по этому индексу для c1

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Напишите обобщенную функцию search, которая использует 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)

0 голосов
/ 19 декабря 2018

Используйте eq (==) для логической маски и получите первый индекс первого True с помощью idxmax:

Замечание :

Решение работает, если оба значения находятся в Серии, второе - после первого значения в 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...