从特定索引开始在Pandas Dataframe中查找匹配的字符串

时间:2018-09-18 15:22:14

标签: python pandas dataframe

我有一个pandas数据框,其中有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"

我希望能够从这些索引处开始遍历数据框,以查找首次出现的“ xyz”,并将这些“ xyz”出现的行写入新的数据框,然后基于该行进行优化遇到的初始字符串。 IE将与初始字符串1对应的所有xyz存储在一个数据帧中,并将与初始string2对应的所有xyz存储在另一个数据帧中。

我不确定如何使用iterrorws和df [“ column”]。str.match(“匹配字符串”)的组合来执行这些迭代。感谢帮助!

4 个答案:

答案 0 :(得分:0)

您为什么不只搜索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

答案 1 :(得分:0)

那这样的事情呢?

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]

[出]

        col0    col3
index       
600     data    xyz
1443    data    xyz
2453    data    xyz

答案 2 :(得分:0)

# 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

答案 3 :(得分:0)

我能够通过使用itertools的下一个功能来搜索并分解出感兴趣的字符串的第一个匹配项,并将列表拼接到我要搜索字符串的区域中,从而解决了这个问题。