実現したいこと
Python初心者です。よろしくお願いいたします。
pythonのデータフレームの操作で条件に該当する値がある時に新しいcolumnを
作成して計算結果を入れたいがエラーが出て実行できないです。
発生している問題・分からないこと
実行するとValue Error「cannot reindex on an axis with duplicate labels」が発生します。
エラーメッセージ
error
1cannot reindex on an axis with duplicate labels
該当のソースコード
#df 品名 購入数量 YM Y M 0 商品1 48.0 2024年01月 2024 01 1 商品2 520.0 2024年02月 2024 02 2 商品3 0.0 2024年03月 2024 03 3 商品4 0.0 2024年05月 2024 05 4 商品5 0.0 2024年06月 2024 06 #Mが01、02、03の時に新しいColumn fin_Y にYから1を引いた数値を入れたいです。 df_x = df last_f_year = ["01","02","03"] fin_cond = df_x["M"].isin(last_f_year) df_x.loc[fin_cond,"fin_Y"] = df_x["Y"] - 1 #ここでエラーになります #欲しい結果 品名 購入数量 YM Y M fin_Y 0 商品1 48.0 2024年01月 2024 01 2023 1 商品2 520.0 2024年02月 2024 02 2023 2 商品3 0.0 2024年03月 2024 03 2023 3 商品4 0.0 2024年05月 2024 05 4 商品5 0.0 2024年06月 2024 06
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
変数fin_condにはBool値が入っていますし、条件を与えずにColumnを追加して
値の追加も出来ますが、locで条件を与えるとエラーになります。
(df_x["fin_Y"] = df_x["Y"] - 1 は普通に実行できます)
補足
初歩的な質問で申し訳ありませんが、よろしくお願いいたします。
Y列の値が文字列(str型)である場合は df_x.loc[fin_cond,"fin_Y"] = df_x["Y"] - 1 で、
TypeError: unsupported operand type(s) for -: 'str' and 'int'
というエラーが発生します。Y列が整数(int型)である場合はエラーは発生しません。
問題のデータフレームはどの様にして作成したのでしょうか?
## 追記
df_x = df としていますが、この場合、df_x と df は同一のデータフレーム(インスタンス)になります。(shallow copy) df_x の内容を変更しても df に影響がない様にする場合は copy() メソッドを使います。
df_x = df.copy() # デフォルトは deep=True なので deep copy になります
pandas.DataFrame.copy — pandas 2.3.3 documentation
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.copy.html
> When deep=False, a new object will be created without copying the calling object’s data or index (only references to the data and index are copied). Any changes to the data of the original will be reflected in the shallow copy (and vice versa).
melianさん
返信、ありがとうございます。元のデータはExcelでY列はファイル名から取得しています。その為、
df["Y"] = df["Y"].astype(int)
でint型に変更して計算が出来るようにしました。
最初は計算でエラーが出ているかと思っていたいので、試しに
df_x["fin_Y"] = df_x["Y"] - 1
で計算が出来るので、今回質問をしたlocの部分でエラーが出ているのかと考えました。
お恥ずかしい話ですが、同一のインスタンスについて理解していなくとりあえず
df_x = df
にしてコピーを作成していました。今回の質問に関係ないのかも知れませんが
教えていただいた
df_x = df.copy()
に変更しても同一のエラー(cannot reindex~)は解消されませんでした。
他に考えられることがあれば教えていただけると幸いです。
よろしくお願いいたします。
こちらの環境は Python3.13.7/Pandas 2.3.3 です。以下のコードをそちらで実行してもらえますか?(こちらではエラーにはなりません)
https://www.mycompiler.io/view/0UenC01e5as
melianさん
返信、ありがとうございます。
今回は他の方の回答で解決することができました。
私の質問にもう少し細かい情報を記載すればよかったと反省しています。
また何かありましたら投稿させていただきますので、
よろしければまたアドバイスをお願いいたします。
よろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー

