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

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

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

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

Q&A

解決済

3回答

2850閲覧

Python3 データフレームの文字列をif文で値に変更する

yuyu127

総合スコア27

Python 3.x

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

0グッド

1クリップ

投稿2017/11/12 10:47

###前提・実現したいこと
UCI Machine Learingのサンプルデータ「Adult Data Set」データの前処理をしています。
https://archive.ics.uci.edu/ml/datasets/adult)
データをデータフレームにして、目的変数「income_class」の値を
「<=50K」であれば「0」、「>50K」であれば「1」にしたいのですが
うまくいきません。
どこか間違っているかご教示ください。

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

データフレームの値を見て、if文で値に変換する関数を定義し、
applyでデータフレームに適用したのですが、うまく読めず、全て
例外(else:)として処理されます。

###該当のソースコード
#データ読み込み
df = pd.read_csv('adult.data', sep=',',header = None)
#列名の変更
df.columns = ['age','workclass','fnlwgt','education','education-num','marital-status','occupation','relationship','race','sex','capital-gain','capital-loss','hours-per-week','native-country','income_class']
#目的変数の取り出し
adults_target = df.income_class
#目的変数をデータフレーム化
adults_target = DataFrame(adults_target)

def incom(a):
'''文字を受け取って、値を返す'''
if a == '<=50K':
return 0
else:
return 1

adults_target['income_class'] = adults_target['income_class'].apply(incom)

###補足情報(言語/FW/ツール等のバージョンなど)
言語はpython3です。

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

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

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

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

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

guest

回答3

0

対応方法と原因はすでに回答あるとおりですが、skipinitialspaceTrueを指定することで、区切り文字に続く空白を除いて読み込むことができます。
参考:Pythonでコンマの後に空白があるcsvを読むときは注意

Python

1df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data', sep=',',header = None, skipinitialspace=True) 2df.iloc[:,14] = df.iloc[:,14].map({"<=50K": 0, ">50K": 1}) 3print(df.iloc[:,14].head(10))

投稿2017/11/13 04:14

can110

総合スコア38266

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

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

yuyu127

2017/11/13 13:54

can110さん ありがとうございました。空白が入っていたとのこで、skipinitialspaceで無事に解決できました。
guest

0

ベストアンサー

質問のコードが動作しない原因ですが、使用しているCSVデータ(
https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
) の形式が

39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K

のように データとデータの間のセパレータが ", " とスペースが挿入されているのが原因と考えられます。
その結果、今回使用するデータである income_class Column の値は ' <=50K' or ' >50K' と頭にスペースが挿入された文字列になっている為、条件文がマッチしません。

一方 wakumeさんの方法は、 read_csv() の引数に delimiter=r"\s+" が追加されており、"1つ以上のスペース文字" を セパレータにしているため、[income_class] Column の値が '<=50K' or '>50K' となり、条件文がうまく動作します。

ただこの方法では、他のデータの語尾に , が挿入されることになります。
その為、本来数値型で読み込む必用がある "[arg]" Column などの値が全て文字列型になってしまいますので個人的にはお勧めしません。

ちなみに、リンク先のページでは、こちらのデータを使用しているようで、そもそも, が削除されたデータ形式となっておりますので、この形式のデータを使用しているのであれば、問題はありません。

ということで、今回は素直に delimiter=", " を使って
df = pd.read_csv("adult.data", header=None, delimiter=r", ", engine='python')
としてデータを読み込むのが良いのではないでしょうか

投稿2017/11/13 03:04

magichan

総合スコア15898

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

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

yuyu127

2017/11/13 13:56

magichanさん 詳細にありがとうございました。無事に解決できました。 大変助かりました。
guest

0

python

1import pandas as pd 2from pprint import pprint 3 4df = pd.read_csv("adult.data", header=None, delimiter=r"\s+", ) 5df.columns = ['age', 'workclass', 'fnlwgt', 'education', 'education-num', 6 'marital-status', 'occupation', 'relationship', 'race', 7 'sex', 'capital-gain', 'capital-loss', 'hours-per-week', 8 'native-country', 'income_class'] 9 10df["income_class"] = df["income_class"].map({"<=50K": 0, ">50K": 1}) 11pprint(df["income_class"].head(10)) 12""" 130 0 141 0 152 0 163 0 174 0 185 0 196 0 207 1 218 1 229 1 23Name: income_class, dtype: int64 24 25"""

Analysis of the Adult data set from UCI Machine Learning Repository

投稿2017/11/12 12:31

編集2017/11/12 14:01
wakame

総合スコア1170

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

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

yuyu127

2017/11/13 00:31

wakameさん ご回答ありがとうございました。 やりたいことができました。 私の定義した関数のif文がおかしかったのでしょうか。
mkgrei

2017/11/13 09:08

ポイントはif文ではなく、 df = pd.read_csv("adult.data", header=None, delimiter=r"\s+", ) だったようです。 magichanさんの回答が的確で、can110さんの方法が汎用性が高く最善に思えます。
yuyu127

2017/11/13 13:57

mkgreiさん コメントありがとうございました。大変参考になりました。 おかげさまで解決でき、理解も深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問