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

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

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

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

Python

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

pandas

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

Q&A

解決済

3回答

1875閲覧

Python DataFrameの一部の文字列を置き換えたい

SuzuAya

総合スコア71

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2020/04/16 07:27

前提・実現したいこと

各列に'性別', '年齢', '職業'…といった情報がそれぞれ記載されているcsvファイルがあります。
それをpandasで読み込み、一部の文字列を別のものに置き換えたい場合はどうすればいいかご教示いただけないでしょうか。

具体的には、「性別」列にある「非公表」と「不明」をNaNに置き換えたいと思っています。

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

文字列の置き換えがうまくいきません。

該当のソースコード

Python

1import pandas as pd 2 3df = pd.read_csv("data.csv") 4 5status_cnt = df["性別"].value_counts() 6print(status_cnt) 7#男性 4323 8#女性 2950 9#非公表 62 10#不明 23 11#女児 1 12#Name: 性別, dtype: int64 13 14df_s = pd.Series([df['性別']])#ここから下のコードが間違っていると思うのですが、どう修正したら良いか分かりません 15print(df_s) 16#0 0 女性 17#1 男性 18#2 男性 19#3 男... 20#dtype: object 21 22df = df_s.str.replace('非公表', 'NaN') 23print(df) 24#0 NaN 25#dtype: float64

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

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

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

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

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

guest

回答3

0

ベストアンサー

お好きな方法をどうぞ

  • Series.mask() を使う - '非公表'と'不明'をマスクする

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.mask.html

Python

1df['性別'] = df.mask(df['性別'].isin(['非公表', '不明']))
  • Series.where() を使う - 男性女性女児以外をマスクする

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.where.html

Python

1df['性別'] = df.where(df['性別'].isin(['男性', '女性', '女児']))
  • Series.replace() を使う - '非公表'と'不明'をNaNに置き換える

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.replace.html

Python

1df['性別'] = df['性別'].replace(['非公表', '不明'], np.nan)

投稿2020/04/16 09:28

magichan

総合スコア15898

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

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

SuzuAya

2020/04/16 11:28

>magichan様 ご回答ありがとうございます!Series.replace() を使ってまさにやりたかったことが実現できました!! 大変助かりました。本当にありがとうございました。
guest

0

以下のように,データフレームの形式のまま処理するのではだめでしょうか?

python

1import numpy as np 2import pandas as pd 3 4df = pd.DataFrame({"性別": ["男性", "不明", "非公表", "女性"]}) 5df.replace(["非公表","不明"], "NaN") 6#df_s = df.replace(["非公表","不明"], "NaN")

投稿2020/04/16 07:45

DataAnalOjisan

総合スコア49

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

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

DataAnalOjisan

2020/04/16 07:50

文字列ではなくNaN値として処理したいのであれば, df.replace(["非公表","不明"], "NaN") を以下のように変更してください。 df.replace(["非公表","不明"], np.nan)
SuzuAya

2020/04/16 08:29 編集

>rHiramoto様 早速のご回答ありがとうございます!試してみたところ、元々8,000人以上のデータが存在していたのですが(詳細な人数は質問のソースコードの部分にも記載しております)、以下のように各カテゴリ1人ずつとなってしまいました。   性別 0 男性 1 不明 2 非公表 3 女性
DataAnalOjisan

2020/04/16 09:07

私のほうで作成したデータフレームはあくまで,動作確認用のサンプルデータになりますので,ご自身の環境に合わせて,データフレーム部分は変更していただければと思います。 ですので,SuzuAyaさんの挙げているコードを参照するのであれば,以下のようになると思われます。 import pandas as pd df = pd.read_csv("data.csv") df["性別"] = df["性別"].replace(["非公表","不明"], "NaN") display(df["性別"])
DataAnalOjisan

2020/04/16 09:09

また,上でも書きましたが,文字列ではなくNaN値として処理したいのであれば以下のようにコードを修正してください。 import numpy as np import pandas as pd df = pd.read_csv("data.csv") df["性別"] = df["性別"].replace(["非公表","不明"], np.nan) display(df["性別"])
SuzuAya

2020/04/16 11:30

>rHiramoto様 勉強不足でお手数をお掛けしております…お忙しいところ追加のアドバイスをいただき、ありがとうございました!
guest

0

こんな感じでどうでしょうか?

df["性別"] = df["性別"].map({'非公表': np.nan, '不明': np.nan})

投稿2020/04/16 07:46

autumn_nsn

総合スコア335

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

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

SuzuAya

2020/04/16 08:33

>autumn_nsn様 早速のご回答ありがとうございます! 試してみたところ、性別列の全て(男性、女性含む)がNaN値になってしまいました…。
magichan

2020/04/16 09:30 編集

Series.map() の場合、定義されていない値は NaN に変更されてしまいますので注意が必用です。 定義されていない値は”変更しない”のであれば、Series.replace() をお使いください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問