Поиск подходящей строки в Pandas Dataframe, начиная с определенных индексов - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть pandas dataframe, в котором 5 совпадающих строк, давайте назовем их «xyz» x строк после начальной совпадающей строки, давайте назовем их «intial string1» и «intial string2»

    index   col0        col3
     500    data   " initial string1"
      ..     ..           ..
     600    data        "xyz"
     ...    ...          ...
     1343   data    "intial string1"
      ..      ..          .. 
     1443   data        "xyz"
      ...   ...          ...
     2432   data    "intial string2"
      ..     ..          ..
     2453   data        "xyz"
       ..    ..           ..
     2467   data    "intial string2"
      ..     ..          ..
     2487   data        "xyz"

Iхотите иметь возможность перебирать кадр данных, начиная с этих индексов, найти первое вхождение «xyz» и записать строки, в которых эти «xyz» встречаются, в новый кадр данных, а затем преуспеть, основываясь на том, какая начальная строка имеетвстречается.IE хранит все xyz, соответствующие начальной строке1, в кадре данных и хранит все xyz, соответствующие начальной строке2, в другом кадре данных.

Я не уверен, как использовать комбинации iterrorws и df ["column"]. Str.match ("совпадающая строка") для выполнения этих итераций.Ценю помощь!

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Я смог решить этот вопрос, используя следующую функцию itertools для поиска и разбивки первого вхождения интересующей строки, и разделив список на области, в которых я хочу найти строки.

0 голосов
/ 18 сентября 2018

Как насчет этого:

indices_initial = [500, 1343, 2432, 5433, 7533]
indices_xyz = []


for i, j in zip(indices[:], indices[1:]):
    indices_xyz.append(df.loc[i:j, 'col3'].eq('xyz').idxmax())

df.loc[indices_xyz]

[out]

        col0    col3
index       
600     data    xyz
1443    data    xyz
2453    data    xyz
0 голосов
/ 18 сентября 2018
# Setting up input data
df = pd.DataFrame(np.random.rand(12500,2), columns=['col0','col1'])
for i in [0, 500, 1343, 2432, 5433, 7533]:
    df.loc[i,'col1']='init string'
for i in range(1,12000,100):
    df.loc[i,'col1']='xyz'

# Hopefully solution to your question
search_results=pd.DataFrame()
for init_index, next_init_index in zip(df[df.col1=='init string'].index, df[df.col1=='init string'][1::].index):
    search_results = search_results.append(df.query('index>'+str(init_index)+
                                                    ' & index<'+str(next_init_index)+
                                                    ' & col1=="xyz"').head(1))
search_results

enter image description here

0 голосов
/ 18 сентября 2018

Почему вы не можете просто найти строки xyz?

df = pd.DataFrame({"col1": ['data', 'data', 'data', 'data', 'data', 'data', 'data'], 
                   'col3': ['initial string', 'something', 'xyz', 
                            'initial string', 'xyz', 'nothing', 'xyz']})

df[df.col3.str.match('xyz')].index

Если у вас несколько разных строк, просто используйте метод .isin:

df[df.col3.isin(['something', 'xyz'])].index
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...