Open24

Pythonについて勉強していく

winnie279winnie279

Pure Python

winnie279winnie279

内側のループをbreakした場合のみ後続の処理を実行する。
if else のインデントがずれていても問題ないらしい(使いたくはない)。

for x in iterable_x:
    for y in iterable_y:
        if x == y:
            break
    else:
        print(f"{x} has no duplicates.")
winnie279winnie279

Pandas

winnie279winnie279

列Aのユニークな要素ごとに、最後の行を取得する。

main.py
df.reset_index().groupby("A", as_index=False).last()  # インデックスも列として保持
df.index = df["index"]  # インデックスを再度割り当て

列Aのユニークな要素ごとに、最後の行以外を取得する。

main.py
df[~df.index.isin(df.index)]
winnie279winnie279
df = pd.DataFrame(
    index=pd.Series([0, 1, 2], name="index"),
    columns=["a", "b", "c"],
)
df = pd.DataFrame(
    index=pd.Series(name="index"),
    columns=["a", "b", "c"],
)
winnie279winnie279
- (df_result["S_CODE"] != transaction["S_CODE"])[df_result["S_CODE"] != transaction["S_CODE"]]
+ (df_result["S_CODE"] != transaction["S_CODE"])[lambda x: x]
winnie279winnie279

df.itertuples() でループしたとき、タプルのインデックスは row.index ではなく row.Index

winnie279winnie279

読み込み時のデータ型指定。読み込み時に指定しないと、最初に float として読み込まれた値を str に変換する際、値が 12345.0 のようになったりする。

PARSE_DATE = ["date"]
DTYPE = {"string": str}
columns = list(DTYPE.keys()) + PARSE_DATES  # オプション

df = pd.read_csv(path, dtype=DTYPE, parse_date=PARSE_DATE)
df[columns]

https://qiita.com/haru1977/items/53c582eb9e264ccf8574
https://qiita.com/tackey/items/5cc9d26ee4aa3ad69d58

winnie279winnie279

Streamlit

winnie279winnie279

st.text_input() によって代入された st.session_state の値がリセットされることがある。

def main():
    # ステートを表示
    st.write(st.session_state)

    # 初回レンダリング
    if "fuga" not in st.session_state:
        st.session_state.hoge = "hoge"
        st.text_input("テキストを入力", key="fuga")  # "fuga"と入力
        return

    # 次回以降レンダリング
    st.button("ボタン")
    return

初回レンダリング時の st.session_state 。値は格納されていない。

テキスト入力後の st.session_state 。明示的に代入した hogest.text_input() によって代入された fuga が格納されている。

ボタン押下後の st.session_state 。明示的に代入した hoge は維持されているが、 st.text_input() によって代入された値 fuga がリセットされている。

意図があってそのような管理仕様になっているとは思うが、解決方法が分からない。
そのため、以下のように対処療法的に対応している。

def main():
    # ステートを表示
    st.write(st.session_state)

    # 初回レンダリング
    if "fuga" not in st.session_state:
        st.session_state.hoge = "hoge"
        st.text_input("テキストを入力", key="fuga")  # "fuga"と入力
        return

    # 次回以降レンダリング
    st.session_state.fuga = st.session_state.fuga  # ステートを明示的に代入
    st.button("ボタン")
    return