2017-08-06 10 views
0

私は多くを検索しましたが、この特定のケースに対する解決策を見つけることができませんでした。私は3つ未満の文字列またはリスト内の項目を含む行を削除したいと思います。私の問題は、より明確に説明されます。Pandasで一定量以下のアイテムやスティングで行を削除するには?

パンダで大きなスウェーデン語データベースを使用してLDAトピックモデリングを準備しており、テストケースを1000行に制限しています。次のように私は特定の列と私のアプローチとの関係はこれまでされていています:

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 

は、その後、私は特定のスウェーデン語、ノルウェー語を維持しながら、最初の引数は任意のメタ文字を削除する正規表現を定義しました手紙。

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, ... 
:データベースからストップワードを削除

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... 

:次に

s0 = p0['PLATSBESKRIVNING'] 

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... 
. 
. 

はパンダのシリーズを作成する:第二引数は言葉< 3が削除されます

Cre新しいデータフレームをatingと空のブラケットを取り外す:

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, ... 

は、文字列の維持:

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'... 

私の問題は、今例えば、私はリストの3未満の文字列を含む行を削除することです3行目、6行目、7行目。希望の結果は次のようになります。

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'... 
. 
. 

これはどのように取得できますか?これがもっとうまくいくかどうか疑問に思っていますか?私のアプローチはとても不器用で扱いにくいようです。

LDAトピックモデリングのインデックスと列名の両方を削除して、ヘッダーとインデックスの桁がないテキストファイルに書き込むこともできます。私が試してみました:

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

しかし、これは引用符ラップ「[「、T 『をワード1』、 『WORD2を』 ..]」ファイル内の文字列の各リストに。

ご提案いただければ幸いです。

敬具 のMo

答えて

0

ちょうどリスト内の項目の数を測定し、長さで行をフィルタよりも低い3

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

恐ろしいモスタファ、これは私の質問を解決し、私の答えに余分な次元を追加しました。 –

0

あなたは使用LENを適用し、その後でデータストアを選択することができますあなたが好きなデータフレーム変数。電子

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

出力:

 
           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

これは私の質問と私が最初に探していたものに本当にうまく答えました。私は最初の答えをマークして以来、私は解決したものとしてマークすることはできませんでしたが、感謝の気持ちを表したいだけです。 –

+0

@ Mo Houshmandを助けてうれしい – Dark