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

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

新規登録して質問してみよう
ただいま回答率
85.48%
pandas

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

Q&A

解決済

3回答

477閲覧

pandasの列値に条件分岐させ、更新したいのですが、エラーとなり、途方に暮れています。

FM_TOWNS

総合スコア59

pandas

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

0グッド

0クリップ

投稿2022/01/24 14:22

編集2022/01/24 14:30

pandasで以下のようなデータフレームを作りました。

columnは各不動産に付いているオーブン名、行にはそれがあるかないか(0は設備なし、1は設備あり)を示しています。
イメージ説明

当方はオーブンの特徴、メーカー等には関心がなく、単純にあるかないか分岐したく、一番左に有無を示す「Oven_Total」を出すようにしました。

df_lodge['Oven_Total'] =df_lodge.sum(axis=1)

column名以外は、0または1しかデータはないため、['Oven_Total']にオーブンがあるかないかが分かると思ったためです。
イメージ説明

ここで1不動産に1つしかオーブン有りのサインが立てばよいのですが、上手くクレンジングするスキルがまだ当方にはないため、Oven_Totalが1超の場合は、1をセットする、そうでない場合は、数値更新なし、としたく、構文してみました。
なお、df_lodge['Oven_Total']のデータタイプは、

dtype('int64')

となっています。
〔対応1〕

df_loge['Oven_Total']=df_lodge.loc[[df_lodge['Oven_Total']>1,'Oven_Total']==1]

結果
'int' object has no attribute 'loc'

〔対応2〕

df_lodge['Oven_Total']=df_lodge['Oven_Total'].mask(df_lodge['Oven_Total']>1,1)

結果
'int' object is not subscriptable

対応1はブールインデックス参照という説明がネットがあり、括弧が多く内容は理解できていませんが、データタイプがint64であるにも関わらず、前記のような結果となりました。
対応2は、条件判定でTrueの場合の対応を引数で記載する、Falseの場合はデータ更新なし、とネットにありましたので、真似して組んでみましたが、こちらも前記のようなエラーとなりました。

EXCELでやれば瞬時に終わる内容ですが、pandasではそうも行かず、苦慮しています。

初歩的な内容の質問ばかりで心苦しいのですが、ご教授いただけますよう、お願い申し上げます。

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

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

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

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

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

guest

回答3

0

> column名以外は、0または1しかデータはないため、
python~~ ~~df_lodge['Oven_Total'] = df_lodge.max(axis=1)~~ ~~

投稿2022/01/24 14:54

編集2022/01/24 16:02
melian

総合スコア19714

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

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

FM_TOWNS

2022/01/24 15:04

クイックなご回答、ありがとうございます。 試してみました。 'int' object has no attribute 'max' となりました。 データタイプは、int64なので、こちらも上手くいきそうな気がするのですが…、何かいい手がありましたら、ご教授いただけますと大変ありがたい限りです。
melian

2022/01/24 15:09

そうなりますと、df_lodge はデータフレームではないということになってしまいますが。。。もしかして、どこかで df_lodge = 何らかの整数値 としてしまっているのではないでしょうか。
FM_TOWNS

2022/01/24 15:48

大変お騒がせしました。 All Rerunさせますと、エラーなく終了させることができました。 但し、こちらについては「Oven_Total(横軸計)が1超の場合は、1をセットする」としたいところ、2が立ったままとなりました。 当方の力では、上限1というところと、max(axis=1)の関係が分かりませんでした。もう、可能であれば、ご教示いただけますと幸いです。 元々の当方の当初説明が舌足らずで、申し訳ございません。
melian

2022/01/24 15:54

ある行に一つでも 1 が含まれているのであれば max(axis=1) は 1 になります。全て 0 なら max(axis=1) は 0 になります。そういう事です。 ただ、今回は 0, 1 だけでなく 2 も含まれているとの事なので、この回答は意味がなくなりましたので無視して下さい。後程、マスキング処理を施します。
FM_TOWNS

2022/01/24 15:59

当方の状況説明が不十分で申し訳ございませんでした。 引き続き、ご鞭撻のほど、よろしくお願いします。
melian

2022/01/24 16:01

言い忘れましたが、 df_lodge['Oven_Total'] = df_lodge.max(axis=1) の処理は Oven_Total 列を作成していない時点で実行しないと意味がありません。 すでに Oven_Total 列がデータフレームの最後の列にある場合には df_lodge['Oven_Total'] = df_lodge.iloc[:,:-1].max(axis=1) とします。
FM_TOWNS

2022/01/24 16:34

追加のコメント、ありがとうございました。 「df_lodge['Oven_Total'] = df_lodge.max(axis=1) の処理は Oven_Total 列を作成していない時点で実行しないと意味がありません」は、ご趣旨ごもっともと思います。 何分、超初心者で、右往左往している状態ですが、よろしくお願いします。
guest

0

python

1df_lodge['Oven_Total'] = (df_lodge.sum(axis=1)>0).astype(int)

です。

投稿2022/01/24 14:37

ppaul

総合スコア24666

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

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

FM_TOWNS

2022/01/24 14:55

早々のご回答、ありがとうございます。 早速、やってみましたが、 'int' object has no attribute 'sum' となってしまいました。 dtype('int64')となっていることから…、当方には解消への想像が及ばないエラーです。 何か、いい手がありましたら、まことに心苦しいのですが、ご教授いただたけますと幸いです。
FM_TOWNS

2022/01/24 16:46

遅くなりましたが、こちらもALL Rerunすると、上手くいきました。 当方の早とちりでお手数をお掛けしました。
FM_TOWNS

2022/01/25 10:20

astype(int)があるので、0,1化にはすぐに使え、便利です。
guest

0

ベストアンサー

「列方向に1が1つでもあるかどうか」で判定すればいいので、以下のようにしてはどうでしょうか。

df_lodge['Oven_Total'] = (df_lodge == 1).any(axis=1)

投稿2022/01/24 14:35

tiitoi

総合スコア21956

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

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

FM_TOWNS

2022/01/24 14:50

早々のご回答ありがとうございます。 anyを使うことまでは思いつきませんでした。 やってみたのですが、 'bool' object has no attribute 'any' となってしまいました。 anyの使い方が理解できていないのですが、何か妙手あれば、ご教示いただけますと助かります。
tiitoi

2022/01/24 15:03 編集

df_lodge は読み込んだ DataFrame になっていますか?print() して確認してください。 Notebook でやっているようであれば、別の値でその変数を上書きしてしまった可能性もあるので、ファイルの読み込みからやり直してみてください。
FM_TOWNS

2022/01/24 15:22

素早いご回答ありがとうございます。 all rerunさせてみたところ、Oven_TotalのcolumnにTrue,Falseが返ってきました。×1で、当方希望の0,1データに変換できました。 データタイプは、'int64'なので、回帰分析にも使えるのかと…正直、安堵しています。 いろいろとネットでも確認しながら進めていますが…、初心者にはハードル高いものが多く、大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問