

以下のファイルがあります。  
Df12元のファイル  
url,url_category,todo  
A,app,0  
B,app,1  
B,app,2  
A,app,3  
C,matome,4  
.......  
上記の形でtodoは1〜100くらいまで重複しないであり、他の項目は重複あります。

[code]

    final_result = 
    [[9, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
    
[/code]

以下isin関数を実行すると順番が変わってしまいます。  
どうやったら変わらず、上の順番通りになるのでしょうか。例えば、9-0-1-2、40-41-0

実行すると

[code]

    cnt = 0
    for l in final_result:
        cnt += 1
        print(df12[df12['todo'].isin(l)])
    
[/code]

結果が以下になりtodoの順番が変わってしまいます。  
url_category,todo  
app,0  
app,0  
app,1  
app,2  
matome,9

本来は上のリスト通り並べたい以下正解です。  
url_category,todo  
matome,9  
app,0  
app,1  
app,2  
app,0


CC BY-SA 4.0
2019-12-19T10:32:00.503
61585
2019-12-19T13:51:37.470
2019-12-19T11:13:56.810
question
python3 pandas
python3 isin関数を使用するが順番通りデータを抽出できない


こんな感じになるかと思います。

[code]

    for l in final_result:
        wdf = pd.DataFrame()
        for x in l:
            wdf = wdf.append(df12[df12['todo'].isin([x])], ignore_index=True)
    
        print(wdf)
    
[/code]


CC BY-SA 4.0
2019-12-19T12:27:13.163
61587
2019-12-19T12:27:13.163
26370
61585
answer


条件に一致する `todo` カラムの index をリストにして `iloc()` で取得するという方法もあります。

[code]

    import pandas as pd
    
    df = pd.DataFrame({
      'url': ['A', 'B', 'B', 'A', 'C'],
      'url_category': ['app', 'app', 'app', 'app', 'matome'],
      'todo': [0, 1, 2, 3, 9],
    })
    print(df)
    
    final_result = [
      [9, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    ]
    
    dfs = [[]]*len(final_result)
    for nth, l in enumerate(final_result):
      dfs[nth] = df.iloc[[df[df['todo'] == i].index[0] for i in l]]\
                   .reset_index(drop=True)
    
    print(dfs[0])
    
    ## df
      url url_category  todo
    0   A          app     0
    1   B          app     1
    2   B          app     2
    3   A          app     3
    4   C       matome     9
    
    ## Sort by final_results
       url url_category  todo
    0    C       matome     9
    1    A          app     0
    2    B          app     1
    3    B          app     2
    4    A          app     0
    5    A          app     0
    6    A          app     0
    7    A          app     0
    8    A          app     0
    9    A          app     0
    10   A          app     0
    11   A          app     0
    12   A          app     0
    13   A          app     0
    
[/code]

**追記**

> 2行目もとる方法ってないですかね？

以下の様になるかと思います。ただし、データフレームの最終行の場合は2行目が無いので、そのままです。

[code]

    for nth, l in enumerate(final_result):
      lst = sum([
        [j, j+1] if j < len(df)-1 else [j]
        for j in [df[df['todo'] == i].index[0] for i in l]], [])
      dfs[nth] = df.iloc[lst].reset_index(drop=True)
    
    print(dfs[0])
    
       url url_category  todo
    0    C       matome     9
    1    A          app     0
    2    B          app     1
    3    B          app     1
    4    B          app     2
    5    B          app     2
    6    A          app     3
    7    A          app     0
    8    B          app     1
    9    A          app     0
    10   B          app     1
               :
               :
    
[/code]


CC BY-SA 4.0
2019-12-19T12:52:26.477
61590
2019-12-19T13:51:37.470
2019-12-19T13:51:37.470
61585
answer