質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1156閲覧

【pandas】【excel】if分岐で条件に合致する値を振り分けたい

makurintan_0415

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/04/16 04:57

編集2021/04/16 05:24

前提・実現したいこと

xlsxファイルを取り込み、80列ほどあるデータ(データ型は様々)の中から二つの列を取り出し
if文で3つの列に振り分けて、元のファイルに挿入していこうとしています。

【抽出したデータ】

金額コード金額
55552000
66663000
666A4000

【振り分け後】

金額コード金額出張費接待費雑費
555520002000
666630003000
666A40004000

エラーメッセージの意味は分かったのですが、どうやればdataframe内の列を自由に
振り分けられるのかがわかりませんでした・・・
ご教授いただければ幸いです。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "<stdin>", line 2, in <module> File "C:\Users\m_sakamoto\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\generic.py", line 1442, in __nonzero__ raise ValueError( ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

該当のソースコード

import pandas as pd df = pd.read_excel('sortdataei12.xlsx',sheet_name = 'Sheet1') cd = df.iloc[:,[32]] #'金額コード'のある列 sl = df.iloc[:,[33]] #'金額'のある列 for i in df.iterrows(): if (cd==5555): df.insert(34,"出張費",sl) elif (cd==6666): df.insert(35,"接待費",sl) else: df.insert(36,"雑費",sl)

試したこと

cd.astype('str')
でデータ型の変換を試みましたが同じエラーが出ます・・・

補足情報(FW/ツールのバージョンなど)

自分なりに調べて、pandasのdataframe内の全体のデータ型は一意じゃない(曖昧だ)からエラーが出る
ということはわかりました。
ですがそこからどうした方がいいかが分かりませんでした・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

if (cd==7777001):ここで使っている(cd==7777001)、これが実は単なる真偽値ではなく真偽値を含むSeriesを返すことに注意してください。書かれているエラーはおそらく、そのせいではないかと。

python3

1print(df["金額コード"]=="5555") 2# 0 True 3# 1 False 4# 2 False 5# Name: 金額コード, dtype: bool 6 7if df["金額コード"]=="5555": 8 print(1) 9# ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

やるならたとえば、下記のようになるかと。

python3

1import io 2import pandas as pd 3data = """金額コード 金額 45555 2000 56666 3000 6666A 4000""" 7 8df = pd.read_table(io.StringIO(data), delimiter="\s+") 9df[["出張費", "接待費", "雑貨"]] = 0 10print(df) 11# 金額コード 金額 出張費 接待費 雑貨 12# 0 5555 2000 0 0 0 13# 1 6666 3000 0 0 0 14# 2 666A 4000 0 0 0 15 16df["出張費"][df["金額コード"]=="5555"] = df["金額"] 17print(df) 18# 金額コード 金額 出張費 接待費 雑貨 19# 0 5555 2000 2000 0 0 20# 1 6666 3000 0 0 0 21# 2 666A 4000 0 0 0

投稿2021/04/16 05:21

編集2021/04/16 05:24
jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makurintan_0415

2021/04/16 07:09 編集

ご回答ありがとうございます! まず、すいません、(cd==7777001)と(cd==7777002)について、表に合わせてませんでした・・・ (cd==5555)と(cd==6666)に訂正させていただきました。 ご回答いただいたコードを試してみたところ、同じ結果になりました。 そのうえで・・・大変恐縮ですが、excelファイルを読み込んだときに 同じような結果にする方法がわかれば教えていただくことは可能でしょうか・・・ excelファイルのデータを全てstring型で読み込む方法が分からず、いただいたご回答を 反映させることができませんでした・・・
jeanbiego

2021/04/16 07:42

dataframeとして読み込んだ後に、astypeで変えるとかもありますが。 https://note.nkmk.me/python-pandas-dtype-astype/ そもそもstring型で読まないといけない理由はありますか? "金額コード"列がstring型ならdf["金額コード"]=="5555"、int型ならdf["金額コード"]==5555と、どちらかに指定すれば良いだけとも思いますが。ファイルが複数あって、ファイルによって変わってしまうようなら、stringに強制してしまうのが良いですが。
makurintan_0415

2021/04/19 01:38

返答遅くなり申し訳ございません! 一度整理と試行してみます!
makurintan_0415

2021/04/19 08:17 編集

ご回答いただいた内容を参考に解決しました! df = pd.read_table(io.StringIO(data), delimiter="\s+") こちらをexcelファイルの時にはどう変えるのかが分かっていませんでした・・・ 以下、コード df = pd.read_excel('sortdataei12.xlsx',sheet_name = 'Sheet1') df[["出張費", "接待費", "雑貨"]] = 0 df["出張費"][df["金額コード"]=="5555"] = df["金額"].copy() 以下で思い通りにできました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問