Search code examples
pythonpandasdataframetextpytorch

How to update Data frame based on specific condition? by dropping not exist directory with Pandas


I have dataframe with missing images in images dir that contians labels data with 2 columns (file_name,text) after reading labels.txt file , My working directory look like :

$ tree
.
├── sample
│   ├------- labels.txt
│   │------- imgs
│   │           └───├── 0.png
│   │               └── 3.png
│   │               └── 4.png
│   │               └── 5.png
│   │               └── 6.png
│   │               └── 7.png
│   │               └── 8.png
│   │               └── 10.png

The labels.txt file :

0.jpg   Elégedetlenek az emberek a közoktatással? Belföld - Magyarország hírei 
1.jpg   Szeged - delmagyar.hu Delmagyar.hu 24 óra Szórakozás Sport Programok 
2.jpg   Állás Ingatlan Hárommilliárdot költenek a ,,boldog békeidőket" idéző Öt 
3.jpg   órát dolgoztak a Szabadság úszóházon, mire Illatoznak is a 
4.jpg   kis harangok, de csak közelről érezni - Madonna tavaly 
5.jpg   még meg tudta akadályozni, idén viszont Egy tálca zsíros 
6.jpg   kenyér - Milyen gyermekkora volt Belföld - Magyarország hírei 
7.jpg   Elégedetlenek az emberek a közoktatással? Elégedetlenek az emberek a 
8.jpg   közoktatással? Független Hírügynökség Az emberek nagyobb része elégedetlen a 
9.jpg   magyarországi közoktatás minőségével. Sokan nem tartják megfelelően felkészültnek a 
10.jpg   pedagógusokat és szükségesnek tartanák a tanárok gyakori, elsősorban pszichológiai

So I wrote small script to read text file using data frame :

import pandas as pd
from pathlib import Path
path = "./sample/" 

df = pd.read_csv(f'{path}labels.txt',
                 header=None,
                 delimiter='   ',
                 encoding="utf8",
                 error_bad_lines=False,
                 engine='python'
                 )
df.rename(columns={0: "file_name", 1: "text"}, inplace=True)
print(df.head(11))

the output after reading :

enter image description here

I am trying to keep only rows that has image in image dir if the dir not exist drop or skip it but after writing functions below it only drop last row (for missing image) for new dataframe

def is_dir_exist(filename):
    path = "/home/ngyongyossy/mohammad/OCR_HU_Tra2022/GPT-2_Parallel/process/sample/"
    path_to_file = f'{path}imgs/'+ filename # df['file_name'][idx] # 'readme.txt'
    path = Path(path_to_file)
    # print(path.is_file()) 
    return path.is_file() 

for idx in range(len(df)):
    # print(df['file_name'][idx])
    print(is_dir_exist(df['file_name'][idx]))
    if not is_dir_exist(df['file_name'][idx]):
        update_df = df.drop(df.index[idx])

print(update_df.head(11))

What I got : file_name text

0      0.jpg  Elégedetlenek az emberek a közoktatással? Belf...
1      1.jpg  Szeged - delmagyar.hu Delmagyar.hu 24 óra Szór...
2      2.jpg  Állás Ingatlan Hárommilliárdot költenek a ,,bo...
3      3.jpg  órát dolgoztak a Szabadság úszóházon, mire Ill...
4      4.jpg  kis harangok, de csak közelről érezni - Madonn...
5      5.jpg  még meg tudta akadályozni, idén viszont Egy tá...
6      6.jpg  kenyér - Milyen gyermekkora volt Belföld - Mag...
7      7.jpg  Elégedetlenek az emberek a közoktatással? Elég...
8      8.jpg  közoktatással? Független Hírügynökség Az ember...
10    10.jpg  pedagógusokat és szükségesnek tartanák a tanár...

But My Expactation is to keep only rows label with existing image folder:

 file_name                                               text
0      0.jpg  Elégedetlenek az emberek a közoktatással? Belf...
3      3.jpg  órát dolgoztak a Szabadság úszóházon, mire Ill...
4      4.jpg  kis harangok, de csak közelről érezni - Madonn...
5      5.jpg  még meg tudta akadályozni, idén viszont Egy tá...
6      6.jpg  kenyér - Milyen gyermekkora volt Belföld - Mag...
7      7.jpg  Elégedetlenek az emberek a közoktatással? Elég...
8      8.jpg  közoktatással? Független Hírügynökség Az ember...
10    10.jpg  pedagógusokat és szükségesnek tartanák a tanár...

Solution

  • import pandas as pd
    from pathlib import Path
    path = "/sample/" 
    
    df = pd.read_csv(f'{path}labels.txt',
                     header=None,
                     delimiter='   ',
                     encoding="utf8",
                     error_bad_lines=False,
                     engine='python'
                     )
    df.rename(columns={0: "file_name", 1: "text"}, inplace=True)
    print(df.head(11))
    
    def is_dir_exist(filename):
        path = "/sample/"
        path_to_file = f'{path}imgs/'+ filename 
        path = Path(path_to_file)
        return path.is_file() 
    
    def drop_row(idx):
        new_df = df.drop(df.index[idx])
        return new_df 
    
    list_fn = []
    for idx in range(len(df)):
        # print(df['file_name'][idx])
        print(is_dir_exist(df['file_name'][idx]))
        if not is_dir_exist(df['file_name'][idx]):
            # new_df = drop_row(idx)
            list_fn.append(df['file_name'][idx])
    
    for i in list_fn: 
        df.drop(df[df['file_name'] == i ].index, inplace = True)
    print(list_fn)
    print(df.head(11))
    

    The expected resulting data frame enter image description here