88921


**やりたいこと**  
pythonで下記のエクセルを読み込み  
searchの列が空白の時だけその行を処理して,google上で検索したいです。  
検索後、searchにOKとして記載したいです。

**エクセル**

country | search  
---|---  
america |  
canada | OK  
spain |  
japan | OK  
  
**現在の結果**  
現在は書き込みする際に元のデータが消えてしまいます。  
消えない方法ありますでしょうか。  
前のデータ消えてしまうので、実現したい結果のように同じエクセルに対して保存可能でしょうか。

country | search  
---|---  
canada | OK  
japan | OK  
| OK  
  
**実現したい結果**  
同じエクセルに対して処理結果を保存したいです。

country | search  
---|---  
america | OK  
canada | OK  
spain | OK  
japan | OK  
  
全体のコード

[code]

    import pandas as pd
    import time
    from datetime import datetime as dt, date, timedelta
    from dateutil.relativedelta import relativedelta
    from selenium import webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.common.keys import Keys
    
    #
    file=r"C:\Users\test\Desktop\country.xlsx"
    
    #エクセル読み込み
    df = pd.read_excel(file)
    #読み込みエクセル指定
    df_country = df["country"]
    
    ##空白からフィルター外す
    # df1 =df[df["フラグ"] != "NaN"]
    
    #空白削除
    df1 =df.dropna(subset=["search"])
    
    print(df1)
    
    df_cnt = len(df1)
    print(df1.head())
    
    for i in range(df_cnt):
    
     #url指定
     url = "https://www.google.com/search?q="+df_country[i]
     
     driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
     #driver = webdriver.Chrome(executable_path="C:\selenium\chromedriver.exe")
     
     #検索サイトを開く
     driver.get(url)
     
     #5秒待機
     time.sleep(5)
     
     df1.loc[i,'search']='OK'
     print("OK・書込み")   
     
     #xlsx書き出し
     df1.to_excel(file, sheet_name="sheet", index=False, header=True)
     
     driver.close()
    
[/code]

すいませんがPandasについてまだ勉強中です。  
もしpandas詳しい方がいましたら、教えていただけると嬉しいです。

お手数ですが、よろしくお願い致します。


CC BY-SA 4.0
2022-05-19T06:58:07.923
88918
2022-05-19T12:19:54.290
2022-05-19T07:19:30.630
3060
18859
question
python python3 pandas
Pandasでフィルターもしくは行削除後、データを書き込みしたい


以下色々と突っ込みどころがあります。

* * *

質問のタイトルと説明の文章で書いてあることが逆です。

  * Pandasでフィルターもしくは行削除後、データを書き込みしたい
  * searchの列が空白の時だけその行を処理して,google上で検索したいです。  
検索後、searchにOKとして記載したいです。

**実現したい結果** からすれば説明の文章の方が正しいでしょう。

しかしプログラムソースはタイトルの処理になっています。

[code]

    #空白削除
    df1 =df.dropna(subset=["search"])
    
[/code]

* * *

それから関連しないDataFrameを作って関連しない行番号でデータ/ファイルを作ろうとしています。

関連する行を抽出：

[code]

    df_country = df["country"]
    
    df1 =df.dropna(subset=["search"])
    
    df_cnt = len(df1)
    
    for i in range(df_cnt):
    
     url = "https://www.google.com/search?q="+df_country[i]
    
     df1.loc[i,'search']='OK'
    
     df1.to_excel(file, sheet_name="sheet", index=False, header=True)
    
    
[/code]

  * 空白行を削除した`df1`の行番号と削除していない`df_country`の行番号は連携していません。  
つまり空白か否かに係わらず、エクセルの最初から順番に処理しています。

  * 空白の時だけ処理したいのに、逆に空白じゃない所`df1`にOKを設定しています。
  * 元のデータはそのまま残しておきたいのに、空白行を削除した`df1`からファイルを作ろうとしています。

* * *

  * 1件検索する毎にファイル書き込みを行っています。

  * `for`ループの中でWebDriverオブジェクトの作成と終了をやっているのは冗長でしょう。

* * *

上記を併せて対処するとエクセル読み込み以後は以下のようになるでしょう。

[code]

    #エクセル読み込み
    df = pd.read_excel(file)
    
    #空白行抽出
    df1 =df[df['search'].isnull()]
    print(df1)
    
    driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
    
    for index, row in df1.iterrows():
    
        #url指定
        url = "https://www.google.com/search?q="+row.country
        
        #検索サイトを開く
        driver.get(url)
        
        #5秒待機
        time.sleep(5)
        
        df.loc[index,'search']='OK'
        print("OK・書込み")
    
    driver.close()
    
    #xlsx書き出し
    df.to_excel(file, sheet_name="sheet", index=False, header=True)
    
[/code]


CC BY-SA 4.0
2022-05-19T08:36:02.600
88921
2022-05-19T12:19:54.290
2022-05-19T12:19:54.290
26370
26370
88918
answer