2017-03-31 19 views
1

の作業ではないパンダDATAFRAMEにフィルター:私はforループを実行したときにが、私はループのために非常にシンプルを持って

## Keep or Drop Rows from Ad Servers 

dataframes = [atlas_df, flashtalking_df, innovid_df, ias_viewability_df, ias_fraud_df] 

for df in dataframes: 
    df = df[df['Placement Name'].str.contains("»")] 

を、何もフィルタません。しかし

、私のように手動でそれを書き留めた場合:

ias_fraud_df = ias_fraud_df[ias_fraud_df['Placement Name'].str.contains("»")] 

フィルタ作品。

私が紛失していることに関するアイデアはありますか?そのリストの元のDFが

例を修正する

for i in range(len(dataframes)): 
    df = dataframes[i]  
    dataframes[i] = df[df['Placement Name'].str.contains("»")] 

これがされて:あなたは、イテレータに取り組んでいる

+0

私はdfラインの単純なカウントを行うことでテストします。 たとえば、 'ias_fraud_df'にforループを適用し、' ias_fraud_df.count() 'を実行すると、行数は同じになります。 手動で適用すると、行数が正しい数に変更されます。 –

答えて

2

は、リストへのインデックスを使用して、元のDFを参照する必要が

In [110]: 
l = list('abcd') 
for x in l: 
    x = 'new_' + x 
l 

Out[110]: 
['a', 'b', 'c', 'd'] 
:対

In [108]: 
l = list('abcd') 
for i in range(len(l)): 
    l[i] = 'new_' + l[i] 

Out[108]: 
['new_a', 'new_b', 'new_c', 'new_d'] 

ですから、他の

+0

私が提供したサンプルをテストしたところ、完全に動作します。しかし、正確な例のコードを適用すると、それでもまだフィルタリングされません –

+0

生データとコードを投稿しない限り、再現できないデータの完全性の問題が発生することがあります。私はあなたのループであなたのフィルタリングが実際にdf – EdChum

+0

をダブルチェックしていることをテストしました。それは完全に機能しますが、新しいデータフレームは呼び出される代わりに、例えば'ias_viewability_df'は、' dataframes [3] 'として呼び出されなければなりません。 'dataframe [3]'の名前を 'ias_viewability_df'に自動的に変更する方法はありますか?したがって、残りの 'dfs 'を' dataframes'リストにマッチさせますか? –

1

あなたはリストの内包表記を使用することができない一方で、意味的にあなたのコードと同じである後者は、リスト内のオリジナルの要素を変更したことがないことを確認 - 出力を濾過Dataframesのリストです:

dataframes = [df[df['Placement Name'].str.contains(u"»")] for df in dataframes] 

サンプル:

atlas_df = pd.DataFrame({'Placement Name':['deu_gathf»', 'deu_gahf', 'fra_gagg'], 
         'another_col':[1,2,3]}) 
flashtalking_df = pd.DataFrame({'Placement Name':['deu_gahf»','fra_ga', 'deu_gatt'], 
         'another_col':[4,5,6]}) 

dataframes = [atlas_df, flashtalking_df] 
print (dataframes) 
[ Placement Name another_col 
0  deu_gathf»   1 
1  deu_gahf   2 
2  fra_gagg   3, Placement Name another_col 
0  deu_gahf»   4 
1   fra_ga   5 
2  deu_gatt   6] 

dataframes = [df[df['Placement Name'].str.contains(u"»")] for df in dataframes] 
print (dataframes) 
[ Placement Name another_col 
0  deu_gathf»   1, Placement Name another_col 
0  deu_gahf»   4] 
+0

誰が正規の答えを探していましたか? – piRSquared