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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

2回答

567閲覧

python 特定の位置の文字が指定した文字だった場合の処理の仕方

ekTJ

総合スコア109

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

0クリップ

投稿2021/04/14 03:39

編集2021/04/14 03:53

実現したいこと、やったこと

データフレームの中身でカラム[入数表示]の値の後ろから二番目が「1」だった場合(@2394×1)、
データを空欄にしたいです。

python

1df = pd.DataFrame({ '本体価格' : ["\2,394","\2,500","\¥3,000"],'入数表示' :["(@2394×1)","(@2500×2)","(@3000×3)"] }) 2 3if df["入数表示"].str[-2] == "1": 4 df["入数表示"] == "" 5else: 6 pass 7 8エラー 9ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 10 11もしくは、df[単位]の値が”1”の場合、下記のように処理するようなif文を考えた方が良いのでしょうか。 12if df["卸単位"] == "1": 13 df["卸単位"] ="" 14else: 15 df["入数表示"] = df["本体卸価格"].str.cat(df["卸単位"], sep = "×") 16 df["入数表示"] = "(@" + df["入数表示"]+")" 17 18こちらも同じエラーになってしまいましたが。。。

どう処理するのが良いのでしょうか。
宜しくお願い致します。

データフレームの中身

本体価格 入数表示   単位
¥2,394 (@2394×1)  1
¥2,500 (@2500×2)  2
¥3,000 (@3000×3)  3

データフレーム完成形

本体価格 入数表示
¥2,394
¥2,500 (@2500×2)
¥3,000 (@3000×3)

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

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

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

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

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

guest

回答2

0

ppaulさんの回答が明快ですが、一応質問欄のコードを元に修正するなら下記になるかと。

python3

1import pandas as pd 2df = pd.DataFrame({ '本体価格' : ["\2,394","\2,500","\¥3,000"],'入数表示' :["(@2394×1)","(@2500×2)","(@3000×3)"] }) 3df["入数表示"][df["入数表示"].str[-2] == "1"] = "" 4print(df) 5# 本体価格 入数表示 6# 0 \2,394 7# 1 \2,500 (@2500×2) 8# 2 \¥3,000 (@3000×3)

これは、下記をご覧になるとわかるように、真偽値のSeriesを返しているので、df["入数表示"]のTrueに該当する箇所にだけ""を代入する操作ですね。

python3

1print([df["入数表示"].str[-2] == "1"]) 2# [0 True 3# 1 False 4# 2 False 5# Name: 入数表示, dtype: bool]

投稿2021/04/14 04:11

編集2021/04/14 04:12
jeanbiego

総合スコア3966

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

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

ekTJ

2021/04/14 06:03

jeanbiego様 わざわざコードに乗っ取って変更していただきありがとうございます。
guest

0

ベストアンサー

こういう場合は、whereかmaskを使います。

今回の場合は、

python

1df['入数表示'].mask(df['入数表示'].str[-2]=='1', "", inplace=True)

です。

詳しいことを知りたければpandasで条件に応じて値を代入(where, mask)を読んでください。

投稿2021/04/14 04:01

ppaul

総合スコア24666

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

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

ekTJ

2021/04/14 06:02

ppaul様 ご丁寧にありがとうございます。 希望通りに処理することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問