2017-08-06 3 views
0

J'ai beaucoup cherché mais je n'ai pas trouvé de solution à ce cas particulier. Je souhaite supprimer toutes les lignes contenant moins de 3 chaînes ou éléments dans les listes. Mes problèmes seront abordés plus clairement plus bas.Comment supprimer des lignes avec moins d'une certaine quantité d'objets ou de piqûres avec les Pandas?

Je prépare une modélisation de sujet LDA avec une grande base de données suédoise dans les pandas et j'ai limité le cas de test à 1000 lignes. Je ne portait que sur une colonne et mon approche spécifique a été jusqu'ici comme suit:

con = sqlite3.connect('/Users/mo/EXP/NAV/afm.db') 
sql = """ 
select * from stillinger limit 1000 
""" 
dfs = pd.read_sql(sql, con) 

plb = """ 
select PLATSBESKRIVNING from stillinger limit 1000 
""" 
dfp = pd.read_sql(plb, con);dfp 

J'ai défini une expression régulière où le premier argument supprime tous les caractères méta tout en gardant la langue norvégienne et suédoise spécifique des lettres. Le second argument supprime les mots < 3:

rep = { 
    'PLATSBESKRIVNING': { 
    r'[^A-Za-zÅåÄäÖöÆØÅæøå]+': ' ', 
    r'\W*\b\w{1,3}\b': ' '} 
} 

p0 = (pd.DataFrame(dfp['PLATSBESKRIVNING'].str.lower()).replace(rep, regex=True). 
    drop_duplicates('PLATSBESKRIVNING').reset_index(drop=True));p0 

PLATSBESKRIVNING 
0 medrek rekrytering söker uppdrag manpower h... 
1 familj barn tjejer kille söker pair ... 
2 uppgift blir tillsammans medarbetare leda ... 
3 behov operasjonssykepleiere langtidsoppdr... 
4 detta perfekta jobbet arbetstiderna vardaga... 
5 familj paris barn söker älskar barn v... 
6 alla inom cafe restaurang förekommande arbets... 
. 
. 

Création d'une série de pandas géants:

s0 = p0['PLATSBESKRIVNING'] 

Puis:

ts = s0.str.lower().str.split();ts 

0  [medrek, rekrytering, söker, uppdrag, manpower... 
1  [familj, barn, tjejer, kille, söker, pair, vil... 
2  [uppgift, blir, tillsammans, medarbetare, leda... 
3  [behov, operasjonssykepleiere, langtidsoppdrag... 
4  [detta, perfekta, jobbet, arbetstiderna, varda... 
5  [familj, paris, barn, söker, älskar, barn, vil... 
6  [alla, inom, cafe, restaurang, förekommande, a... 
7  [diskare, till, cafe, dubbel, sökes, arbetet, ... 
8  [diskare, till, thelins, konditori, sökes, arb... 

Suppression des mots d'arrêt de la base de données:

r = s0.str.split().apply(lambda x: [item for item in x if item not in mswl]);r 

0  [uppdrag, bemanningsföretag, erbjuds, tillägg,... 
1  [föräldrarna, citycentre, stort, tomt, mamman,... 
2  [utveckla, övergripande, strategiska, frågor, ... 
3     [erfaring, sykepleier, legitimasjon] 
4  [arbetstiderna, vardagar, härliga, människor, ... 
5  [paris, utav, badrum, båda, yngsta, endast, fö... 
6      [förekommande, emot, utbildning] 
7              [] 
8            [thelins] 
9  [paris, baby, månader, våning, delar, badrum, ... 

Cre Ating une nouvelle trame de données et de supprimer les crochets vides:

dr = pd.DataFrame(r) 
dr0 = dr[dr.astype(str)['PLATSBESKRIVNING'] != '[]'].reset_index(drop=True); dr0 

PLATSBESKRIVNING 
0 [uppdrag, bemanningsföretag, erbjuds, tillägg,... 
1 [föräldrarna, citycentre, stort, tomt, mamman,... 
2 [utveckla, övergripande, strategiska, frågor, ... 
3 [erfaring, sykepleier, legitimasjon] 
4 [arbetstiderna, vardagar, härliga, människor, ... 
5 [paris, utav, badrum, båda, yngsta, endast, fö... 
6 [förekommande, emot, utbildning] 
7 [thelins] 
8 [paris, baby, månader, våning, delar, badrum, ... 

Le maintien de la chaîne:

dr1 = dr0['PLATSBESKRIVNING'].apply(str); len(dr1),type(dr1), dr1 

0  ['uppdrag', 'bemanningsföretag', 'erbjuds', 't... 
1  ['föräldrarna', 'citycentre', 'stort', 'tomt',... 
2  ['utveckla', 'övergripande', 'strategiska', 'f... 
3    ['erfaring', 'sykepleier', 'legitimasjon'] 
4  ['arbetstiderna', 'vardagar', 'härliga', 'männ... 
5  ['paris', 'utav', 'badrum', 'båda', 'yngsta', ... 
6     ['förekommande', 'emot', 'utbildning'] 
7           ['thelins'] 
8  ['paris', 'baby', 'månader', 'våning', 'delar'... 

Mon problème est maintenant que je veux supprimer toutes les lignes qui contient moins de 3 chaînes dans les listes, par exemple ligne 3, 6 et 7. Résultat souhaité serait comme ceci:

0  ['uppdrag', 'bemanningsföretag', 'erbjuds', 't... 
1  ['föräldrarna', 'citycentre', 'stort', 'tomt',... 
2  ['utveckla', 'övergripande', 'strategiska', 'f... 
3  ['arbetstiderna', 'vardagar', 'härliga', 'männ... 
4  ['paris', 'utav', 'badrum', 'båda', 'yngsta', ... 
5  ['paris', 'baby', 'månader', 'våning', 'delar'... 
. 
. 

Comment l'obtenir? Je me demande aussi si cela pourrait être fait d'une manière plus propre? Mon approche semble si maladroite et encombrante. Je voudrais également supprimer à la fois les index et le nom de la colonne pour la modélisation de la rubrique LDA afin que je puisse l'écrire dans un fichier texte sans l'en-tête et les chiffres des index. J'ai essayé:

dr1.to_csv('LDA1.txt',header=None,index=False) 

Mais cette enveloppe entre guillemets « [ « de word1 », « mot2 », « t ..] » à la chaque liste de chaînes dans le fichier.

Toutes les suggestions seraient grandement appréciées.

Meilleures salutations Mo

Répondre

0

juste mesure le nombre d'éléments dans la liste et filtrer les lignes d'une longueur inférieure à 3

dr0['length'] = dr0['PLATSBESKRIVNING'].apply(lambda x: len(x)) 
cond = dr0['length'] > 3 
dr0 = dr0[cond] 
+0

Impressionnant Mostafa, cette résolu ma question et a ajouté une dimension supplémentaire à ma réponse. –

0

Vous pouvez utiliser appliquer len puis sélectionnez magasin de données dans le variable de dataframe que vous aimez i.e

df[df['PLATSBESKRIVNING'].apply(len)>3] 

Sortie:

 
           PLATSBESKRIVNING 
0 [uppdrag, bemanningsföretag, erbjuds, nice] 
1  [föräldrarna, citycentre, stort, tomt] 
2 [utveckla, övergripande, strategiska, fince] 
4  [arbetstiderna, vardagar, härliga, männ] 
5   [paris, utav, badrum, båda, yngsta] 
8   [paris, baby, månader, våning, delar] 
+0

Ce fut une réponse très bien à ma question et exactement ce que je cherchais initialement. Je ne pouvais pas marquer celui-ci comme résolu depuis que j'ai marqué la première réponse, mais je veux juste exprimer ma gratitude. –

+0

Heureux d'aider @ Mo Houshmand – Dark