🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

pandas

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

Q&A

解決済

2回答

211閲覧

for文をapply.(lambda)に変更する例について

D7U

総合スコア22

Python

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

pandas

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

0グッド

1クリップ

投稿2019/11/20 13:17

下記の文をapply.(lambda x:.......)で書き換えるとどのような文になりますでしょか。

行いたい処理
人口が50万以上であれば大都市ただし、"市区町村名"に"区"が入っていた場合も大都市、10万以上50万未満であれば中都市、1万以上10万未満であれば小都市、それ以外は田舎

python

1for i in range(len(df004)): 2 if df004.loc[i,"人口総計"] >= 500000 and ("区" in df004.loc[i,"市区町村名"]): 3 df004.loc[i,"都市規模"] = "大都市" 4 elif df004.loc[i,"人口総計"] >= 100000 and df004.loc[i,"人口総計"] < 500000: 5 df004.loc[i,"都市規模"] = "中都市" 6 elif df004.loc[i,"人口総計"] >= 10000 and df004.loc[i,"人口総計"] < 100000: 7 df004.loc[i,"都市規模"] = "小都市" 8 else: 9 df004.loc[i,"都市規模"] = "田舎"

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

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

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

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

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

guest

回答2

0

ベストアンサー

apply()を使っても書けますが、

  • 人口でbin分割して都市規模をラベリングする
  • 市町村名から'区'を検出して都市規模を変更する

の2つの処理を分割するともう少しスッキリ記述できる気がします。

Python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame({"人口総計":[1000000, 500000, 100000, 100000, 10000, 1000], 5 "市区町村名":["A市", "B市", "C市", "D区", "E町", 'F村']}) 6 7df["都市規模"] = pd.cut(df['人口総計'], 8 bins=[0,10000,100000,500000,np.inf], 9 labels=['田舎','小都市','中都市','大都市'], 10 right=False) 11df.loc[df['市区町村名'].str.endswith('区'), '都市規模'] = '大都市' 12 13print(df) 14# 人口総計 市区町村名 都市規模 15#0 1000000 A市 大都市 16#1 500000 B市 大都市 17#2 100000 C市 中都市 18#3 100000 D区 大都市 19#4 10000 E町 小都市 20#5 1000 F村 田舎

投稿2019/11/20 23:38

magichan

総合スコア15898

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

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

0

lambda式でも書けますが、可読性の観点からはばかられたので別途関数を定義することにしました。

python

1import pandas as pd 2 3df = pd.DataFrame({"人口総計":[10**6, 10**5, 10**4, 10**4, 10**3], 4 "市区町村名":["hoge市", "fuga市", 5 "piyo区", "piyo市", "foo村"]}) 6 7def f(row): 8 """ 9 人口が50万以上であれば大都市ただし、"市区町村名"に"区"が入っていた場合も大都市、 10 10万以上50万未満であれば中都市、1万以上10万未満であれば小都市、それ以外は田舎 11 """ 12 if row["人口総計"] >= 5 * 10 ** 5 or "区" in row["市区町村名"]: 13 return "大都市" 14 elif row["人口総計"] >= 1 * 10 ** 5: 15 return "中都市" 16 elif row["人口総計"] >= 1 * 10 ** 4: 17 return "小都市" 18 else: 19 return "田舎" 20 21df["都市規模"] = df.apply(f, axis=1) 22print(df) 23""" => 24 人口総計 市区町村名 都市規模 250 1000000 hoge市 大都市 261 100000 fuga市 中都市 272 10000 piyo区 大都市 283 10000 piyo市 小都市 294 1000 foo村 田舎 30"""

投稿2019/11/20 13:29

hayataka2049

総合スコア30935

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問