88763


先ずはPythonで特定の行番号を取得したいです。  
番号を取得後、任意の行数を抽出して、それ以降の行を削除したいです。

コードのどこがいけないのかpandasに詳しい方教えていただけませんでしょうか。

set_indexの部分でしょうか。

元のエクセル

国  
---  
America  
2022/5/10  
Japan  
  
**実現したいエクセル**  
**条件**  
日付がある行の番号を取得して、それ以後の行を削除したいです。  
日付は毎回同じ行に表示されないです。  
エクセルの中に１回のみ日付が表示されます。

国  
---  
America  
  
エラー内容

[code]

               国
    0    America
    1  2022/5/10
    2      Japan
    
    Traceback (most recent call last):
      File "c:\Users\test\Documents\test.py", line 21, in <module>
        df.set_index(yesterday, inplace=True)
      File "C:\Users\test\AppData\Roaming\Python\Python39\site-packages\pandas\util\_decorators.py", line 311, in wrapper
        return func(*args, **kwargs)
      File "C:\Users\test\AppData\Roaming\Python\Python39\site-packages\pandas\core\frame.py", line 5446, in set_index
        raise KeyError(f"None of {missing} are in the columns")
    KeyError: "None of ['2022/05/10'] are in the columns"
    PS C:\Users\test>
    
[/code]

全体のコード

[code]

    import pandas as pd
    from datetime import datetime as dt, date, timedelta
    from dateutil.relativedelta import relativedelta
    
    
    time= dt.now().strftime("%Y%m%d")
    
    today= dt.now().strftime("%Y/%m/%d")
    
    yesterday =dt.strftime( dt.today() - relativedelta( days = 1 ), "%Y/%m/%d" )
    
    
    #保存ファイル指定
    file="test.csv"
    
    #Csv読み込み
    df =pd.read_csv(file)
    
    print(df)
    
    #set_index指定
    df.set_index(yesterday, inplace=True)
    
    #行番号取得
    delete=df.index.get_loc(yesterday)
    print(delete)
    
    #2番号指定(現在手動で指定)
    delete_df = df[2:]
    
    delete_df.to_csv(file,index=False,encoding="utf_8_sig")
    
    
[/code]

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


CC BY-SA 4.0
2022-05-11T02:42:24.953
88752
2022-05-11T11:02:44.973
2022-05-11T07:32:18.380
18859
18859
question
python python3 pandas
データフレームから不要な行データを削除する方法


元データが保証されていない, ようなコメントがあるので, まずはそこから …

けど, 正しいデータがあったとしても `set_index()` で何を行いたいのか未だに不明です

[code]

    import pandas as pd
    import random
    import io
    
    # テストデータ生成
    dt = pd.Timestamp('2022/5')
    df = pd.DataFrame({
        '国': random.choices('日本 米国 英国 ドイツ フランス イタリア カナダ'.split(), k=30),
        '日付': [dt +pd.Timedelta(days=random.randint(0, 10))for _ in range(30)],
        })
    
    with io.StringIO() as fp:
        df.to_csv(fp, index=False)
        fp.seek(0)
        # print(fp.getvalue())
        df = pd.read_csv(fp, parse_dates=[1])
    
    yesterday = pd.Timestamp('today').floor('D') -pd.offsets.Day(1)
    cnt = (df['日付'] == yesterday).sum()   # 日付に該当するデータ件数
    display(df[df['日付'] == yesterday].index)   # index 一覧
    
[/code]

日付項目を indexとするのなら, 以下のようにどちらかで指定  
(`yesterday` という項目名は存在しない, のでは？)

[code]

    with io.StringIO() as fp:
        df.to_csv(fp, index=False)
        fp.seek(0)
        # print(fp.getvalue())
        df = pd.read_csv(fp, parse_dates=[1], index_col=1)   # 日付で indexとする
    
    yesterday = pd.Timestamp('today').floor('D') -pd.offsets.Day(1)
    
    # 日付で indexとするなら, read_csv() 時, もしくはここで指定
    #df.set_index('日付', inplace=True)
    
    lst = df.index.get_loc(yesterday)
    if isinstance(lst, int):
        start = lst
        display(df[start:].head(n=3))
    else:
        print(lst)
    
[/code]


CC BY-SA 4.0
2022-05-11T08:56:08.263
88760
2022-05-11T08:56:08.263
43025
88752
answer


何か理由があってPythonで処理したい場合には、以下の記事が参考になるでしょう。  
[条件を満たす最初/最後の行を取得 -
pandas](https://ikatakos.com/pot/programming/python/packages/pandas/first_row_where_true)

>
[code]

>     # aaa列が1になる最初の行のindexを取得
>     idx = df[df['aaa'] == 1].index[0]
>  
[/code]

[pandas.Series.str.match](https://pandas.pydata.org/docs/reference/api/pandas.Series.str.match.html)

[【Pandas】データフレームから不要な行を削除](https://pyhoo.jp/pandas-index)

> データフレームの行数を指定（０行目から２行目まで）
[code]

>     fruits_df = fruits_df[0:3]
>  
[/code]

以下のようになります。

[code]

    import pandas as pd
    #保存ファイル指定
    file="test.csv"
    #Csv読み込み
    df =pd.read_csv(file)
    print(df)
    #### ここまでは質問のソースの必要部分、以下が日付データの行以後を削除してセーブする処理
    
    #### 日付データが存在しない場合も考えてtry exceptで囲む
    try:
      idx = df[df['国'].str.match(r'\d{4}/\d{1,2}/\d{1,2}') == True].index[0]
      delete_df = df[:idx]
      delete_df.to_csv(file,index=False,encoding="utf_8_sig")
    except:
      pass
    
[/code]


CC BY-SA 4.0
2022-05-11T09:27:47.990
88762
2022-05-11T09:39:59.987
2022-05-11T09:39:59.987
26370
26370
88752
answer

[code]

    import pandas as pd
    from datetime import datetime as dt, date, timedelta
    from dateutil.relativedelta import relativedelta
    
    pd.set_option('display.unicode.east_asian_width', True)
    
    df = pd.DataFrame({
      '国': ['America', 'Russia', '2022/5/10', 'Japan']
    })
    yesterday = dt.strftime( dt.today() - relativedelta( days = 1 ), "%Y/%-m/%-d" )
    
    #
    dfx = df.iloc[:m.idxmax()] if any(m:=(df['国']==yesterday)) else df
    print(dfx)
    
    #
            国
    0  America
    1   Russia
    
[/code]


CC BY-SA 4.0
2022-05-11T10:04:21.583
88763
2022-05-11T11:02:44.973
2022-05-11T11:02:44.973
47127
47127
88752
answer