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

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

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

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

pandas

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

Q&A

解決済

1回答

747閲覧

DataFrameの特定列から要素を取得する方法

_hide

総合スコア2

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2021/04/25 14:17

編集2021/04/25 21:37

元のデータセット

user 0 40代男性 1 20代女性 2   Nan 3   男性

前提・実現したいこと

pandasのlambdaを使うところはイメージできているのですが、その後のif、findを使う場合の具体的なイメージがわかず、ご教示いただきたいです。
※if,findにはこだわってないのでその他の書き方でも結構です

Python

1df['gender']=df['user'].apply(lambda x:x if x.find~~ else '') 2df['agerange']=df['user'].apply(lambda x:x if x.find~~ else '')

作りたいデータセット

user gender agerange 0 40代男性   男性     40代 1 20代女性  女性     20代 2   Nan     不明     不明 3   男性     男性     不明

追記
ご回答ありがとうございます。
lambdaにはこだわってませんがdefに慣れていないのでlmabdaでできるとうれしいと考えてました。
(これを機にdefに慣れようと思います!)
とは言えになりますが…
1.userの「Nan」の欠損値処理をすればlambdaで比較的簡易になれば記載法をご教示いただきたいです。
※Nanの欠損値処理はできます
2.複雑な条件分岐の自然言語自体をlambdaで処理することは一般的ではないのですか?

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

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

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

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

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

meg_

2021/04/25 15:20

> ※if,findにはこだわってないのでその他の書き方でも結構です 「lambda」にはこだわっている、ということでしょうか?
_hide

2021/04/25 21:38

ご回答ありがとうございます。 lambdaでできればうれしいと思ってましたがご記載の通りlambdaにはこだわってません。
guest

回答1

0

ベストアンサー

もとのデータが自然言語で書かれているため、lambdaを使うには条件分岐が複雑だったのですが、以下のようにしてはどうでしょうか

python3

1from math import nan 2import pandas as pd 3 4def getGender(x): 5 if not type(x) is str: 6 return "不明" 7 8 if "男性" in x: 9 return "男性" 10 elif "女性" in x: 11 return "女性" 12 else: 13 return "不明" 14 15def getAgeRange(x): 16 if not type(x) is str: 17 return "不明" 18 19 for i in range(1,10): 20 # 半角英数字での入力を仮定 21 # 100代以上は存在しないことを仮定 22 if (str(i*10)+ "代") in x: 23 return str(i*10) + "代" 24 return "不明" 25 26 27def main(): 28 df = pd.DataFrame(["40代男性", "20代女性", nan, "男性"], columns=["user"]) 29 df['gender']=df['user'].apply(getGender) 30 df['agerange']=df['user'].apply(getAgeRange) 31 print(df) 32 return 33 34if __name__ == '__main__': 35 main()

以下追記

コメント欄ではコードを埋め込めなかったので同じコードを貼っておきます

python3

1 2from math import nan 3import pandas as pd 4 5def main(): 6 df = pd.DataFrame(["40代男性", "20代女性", nan, "男性"], columns=["user"]) 7 df['gender']=df['user'].apply(lambda x: "不明" if not type(x) is str else ("女性" if "女性" in x else ("不明"))) 8 df['agerange']=df['user'].apply(lambda x: "不明" if not type(x) is str else ("10代" if "10代" in x else ("20代" if "20代" in x else ("30代" if "30代" in x else ("40代" if "40代" in x else ("50代" if "50代" in x else ("60代" if "60代" in x else ("70代" if "70代" in x else( "80代" if "80代" in x else ("90代" if "90代" in x else ("100代" if "100代" in x else "不明"))))))))))) 9 print(df) 10 return 11 12if __name__ == '__main__': 13 main()

投稿2021/04/25 14:56

編集2021/04/26 09:23
Harig

総合スコア11

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

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

_hide

2021/04/26 03:57 編集

ご回答ありがとうございます。 lambdaにはこだわってませんがdefに慣れていないのでlmabdaでできるとうれしいと考えてました。 (これを機にdefに慣れようと思います!) ちなみに userの「Nan」の欠損値処理をすればlambdaで処理はできますか??? ※Nanの欠損値処理はできます
Harig

2021/04/26 09:21

genderについては比較的簡単にlambda で書けますが、可読性は低めです(個人的には) またagerangeに関するforを無理やり展開することによってもlambdaを使って処理することが出来ます。 こちらは著しく可読性が低いです。 ``` python3 from math import nan import pandas as pd def main(): df = pd.DataFrame(["40代男性", "20代女性", nan, "男性"], columns=["user"]) df['gender']=df['user'].apply(lambda x: "不明" if not type(x) is str else ("女性" if "女性" in x else ("不明"))) df['agerange']=df['user'].apply(lambda x: "不明" if not type(x) is str else ("10代" if "10代" in x else ("20代" if "20代" in x else ("30代" if "30代" in x else ("40代" if "40代" in x else ("50代" if "50代" in x else ("60代" if "60代" in x else ("70代" if "70代" in x else( "80代" if "80代" in x else ("90代" if "90代" in x else ("100代" if "100代" in x else "不明"))))))))))) print(df) return if __name__ == '__main__': main() ```
_hide

2021/04/26 14:33

Harigさん 2つのご回答、ご丁寧にありがとうございました。 実際に2つの方法で書いてみましたが最初に記載いただいた方法の方がしっくりしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問