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

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

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

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

pandas

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

Q&A

解決済

1回答

983閲覧

Pandasで変数を代入することで簡単にリストを作る方法について

takkucook

総合スコア5

Python

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

pandas

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

0グッド

0クリップ

投稿2021/04/27 04:14

10個のデータフレームから特定の値のデータを数え上げ、新しいデータフレームを作りたいと考えています。(pandas)
その時に、まず、リスト化してから最終的にデータフレームを作成する流れで進めているのですが、そのリストが煩雑すぎるので、より簡単に作れる方法を教えていただきたいです。

python

1list = [[((df_4['転入時年齢'] >= 0)&(df_4['転入時年齢'] <= 4)).sum(), 2 ((df_4['転入時年齢'] >= 5)&(df_4['転入時年齢'] <= 9)).sum(), 3 ((df_4['転入時年齢'] >= 10)&(df_4['転入時年齢'] <= 14)).sum(), 4 ((df_4['転入時年齢'] >= 15)&(df_4['転入時年齢'] <= 19)).sum(), 5 ((df_4['転入時年齢'] >= 20)&(df_4['転入時年齢'] <= 24)).sum(), 6 ((df_4['転入時年齢'] >= 25)&(df_4['転入時年齢'] <= 29)).sum(), 7 ((df_4['転入時年齢'] >= 30)&(df_4['転入時年齢'] <= 34)).sum(), 8 ((df_4['転入時年齢'] >= 35)&(df_4['転入時年齢'] <= 39)).sum(), 9 ((df_4['転入時年齢'] >= 40)&(df_4['転入時年齢'] <= 49)).sum(), 10 ((df_4['転入時年齢'] >= 50)&(df_4['転入時年齢'] <= 54)).sum(), 11 ((df_4['転入時年齢'] >= 55)&(df_4['転入時年齢'] <= 59)).sum(), 12 ((df_4['転入時年齢'] >= 60)&(df_4['転入時年齢'] <= 64)).sum(), 13 ((df_4['転入時年齢'] >= 65)&(df_4['転入時年齢'] <= 69)).sum(), 14 ((df_4['転入時年齢'] >= 70)&(df_4['転入時年齢'] <= 74)).sum(), 15 ((df_4['転入時年齢'] >= 75)&(df_4['転入時年齢'] <= 79)).sum(), 16 ((df_4['転入時年齢'] >= 80)&(df_4['転入時年齢'] <= 84)).sum(), 17 ((df_4['転入時年齢'] >= 85)&(df_4['転入時年齢'] <= 89)).sum(), 18 ((df_4['転入時年齢'] >= 90)&(df_4['転入時年齢'] <= 94)).sum(), 19 ((df_4['転入時年齢'] >= 95)&(df_4['転入時年齢'] <= 99)).sum(), 20 ((df_4['転入時年齢'] >= 100)).sum()],

このコードをdf_13まで打てば無事にリストは作れるのですが、コードが長すぎるし、何よりdf_5~13まで、数字を消して打ち直すのが面倒なので、
できればもっと簡単にリストを作れる方法を教えていただきたいです。

なお、完全初心者なので、いろいろ調べてみたのですがよくわかりませんでした。

pyton

1i = [4,5,6,7,8,9,10,11,12,13] 2for i in list : 3 list = [[((df_i['転入時年齢'] >= 0)&(df_x['転入時年齢'] <= 4)).sum(), 4 ((df_i['転入時年齢'] >= 5)&(df_i['転入時年齢'] <= 9)).sum(), 5 ((df_i['転入時年齢'] >= 10)&(df_i['転入時年齢'] <= 14)).sum(), 6 ((df_i['転入時年齢'] >= 15)&(df_i['転入時年齢'] <= 19)).sum(), 7 ((df_i['転入時年齢'] >= 20)&(df_i['転入時年齢'] <= 24)).sum(), 8 ((df_i['転入時年齢'] >= 25)&(df_i['転入時年齢'] <= 29)).sum(), 9 ((df_i['転入時年齢'] >= 30)&(df_i['転入時年齢'] <= 34)).sum(), 10 ((df_i['転入時年齢'] >= 35)&(df_i['転入時年齢'] <= 39)).sum(), 11 ((df_i['転入時年齢'] >= 40)&(df_i['転入時年齢'] <= 49)).sum(), 12 ((df_i['転入時年齢'] >= 50)&(df_i['転入時年齢'] <= 54)).sum(), 13 ((df_i['転入時年齢'] >= 55)&(df_i['転入時年齢'] <= 59)).sum(), 14 ((df_i['転入時年齢'] >= 60)&(df_i['転入時年齢'] <= 64)).sum(), 15 ((df_i['転入時年齢'] >= 65)&(df_i['転入時年齢'] <= 69)).sum(), 16 ((df_i['転入時年齢'] >= 70)&(df_i['転入時年齢'] <= 74)).sum(), 17 ((df_i['転入時年齢'] >= 75)&(df_i['転入時年齢'] <= 79)).sum(), 18 ((df_i['転入時年齢'] >= 80)&(df_i['転入時年齢'] <= 84)).sum(), 19 ((df_i['転入時年齢'] >= 85)&(df_i['転入時年齢'] <= 89)).sum(), 20 ((df_i['転入時年齢'] >= 90)&(df_i['転入時年齢'] <= 94)).sum(), 21 ((df_i['転入時年齢'] >= 95)&(df_i['転入時年齢'] <= 99)).sum(), 22 ((df_i['転入時年齢'] >= 100)).sum()]] 23print(list)

for文で繰り返しでできるか試しましたが

NameError: name 'df_i' is not defined

df_iは定義されていないと出てしまいました。

どなたかよろしくお願いいたします。

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

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

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

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

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

meg_

2021/04/27 04:26

> 何よりdf_5~13まで、数字を消して打ち直すのが面倒 エディタの機能を使えば簡単に置換出来ますよ。ツールは何をお使いでしょう?
ppaul

2021/04/27 04:33

リストにしてからデータフレームにするよりも直接データフレームを作った方が簡単な気がしますが、リストにしたいですか?
takkucook

2021/04/27 04:41 編集

@ppaul いきなりデータフレームでかまいません。 あまり詳しくないので、ひとまずリスト化してからデータフレームを作成する流れを試してみました。
takkucook

2021/04/27 04:41 編集

@meg_ そうなんですよね。打ち直しが本当に面倒で、、、 jupyter labを使っています。
guest

回答1

0

ベストアンサー

とりあえずの回答です。

リストを作るだけなら、以下の様な感じです。(未確認ですがだいたいこんなものです)

python

1df_list = [df_4,df_5,df_6,df_7,df_8,df_9,df_10,df_11,df_12,df_13] 2 3result_list = [[((df['転入時年齢'] >= 0)&(df_x['転入時年齢'] <= 4)).sum(), 4 ((df['転入時年齢'] >= 5)&(df['転入時年齢'] <= 9)).sum(), 5 ((df['転入時年齢'] >= 10)&(df['転入時年齢'] <= 14)).sum(), 6 ((df['転入時年齢'] >= 15)&(df['転入時年齢'] <= 19)).sum(), 7 ((df['転入時年齢'] >= 20)&(df['転入時年齢'] <= 24)).sum(), 8 ((df['転入時年齢'] >= 25)&(df['転入時年齢'] <= 29)).sum(), 9 ((df['転入時年齢'] >= 30)&(df['転入時年齢'] <= 34)).sum(), 10 ((df['転入時年齢'] >= 35)&(df['転入時年齢'] <= 39)).sum(), 11 ((df['転入時年齢'] >= 40)&(df['転入時年齢'] <= 49)).sum(), 12 ((df['転入時年齢'] >= 50)&(df['転入時年齢'] <= 54)).sum(), 13 ((df['転入時年齢'] >= 55)&(df['転入時年齢'] <= 59)).sum(), 14 ((df['転入時年齢'] >= 60)&(df['転入時年齢'] <= 64)).sum(), 15 ((df['転入時年齢'] >= 65)&(df['転入時年齢'] <= 69)).sum(), 16 ((df['転入時年齢'] >= 70)&(df['転入時年齢'] <= 74)).sum(), 17 ((df['転入時年齢'] >= 75)&(df['転入時年齢'] <= 79)).sum(), 18 ((df['転入時年齢'] >= 80)&(df['転入時年齢'] <= 84)).sum(), 19 ((df['転入時年齢'] >= 85)&(df['転入時年齢'] <= 89)).sum(), 20 ((df['転入時年齢'] >= 90)&(df['転入時年齢'] <= 94)).sum(), 21 ((df['転入時年齢'] >= 95)&(df['転入時年齢'] <= 99)).sum(), 22 ((df['転入時年齢'] >= 100)).sum()] for df in df_list]

直接データフレームを作るのは、処理はたいしたことはないのですが、テストデータ作成に時間がかかるのでちょっと待ってください。

こんな感じです。ちょっと勉強が必要ですが、読み解いてください。

python

1>>> import pandas as pd 2>>> df_list = [df_4,df_5,df_6,df_7,df_8,df_9,df_10,df_11,df_12,df_13] 3>>> dummy_df = pd.DataFrame({'転入時年齢範囲':list(range(0,101,5)), 'count': [0]*21}) 4>>> 5>>> result_list = [] 6>>> for i, df in enumerate(df_list): 7... temp_df1 = pd.DataFrame({'転入時年齢範囲':df['転入時年齢'].apply(lambda age: (age//5)*5 if age<100 else 100), 'count':[1]*len(df)}) 8... temp_df2 = pd.concat([temp_df1, dummy_df]).groupby('転入時年齢範囲').sum() 9... temp_df2.columns = [f'df_{i+4}'] 10... result_list.append(temp_df2) 11... 12>>> result_df = pd.concat(result_list, axis=1) 13>>> result_df.index = [f'{i}歳~{i+4}歳' for i in range(0,100,5)] + ['100歳以上'] 14>>> 15>>> print(result_df) 16 df_4 df_5 df_6 df_7 df_8 df_9 df_10 df_11 df_12 df_13 170歳~40 0 1 2 1 3 2 2 3 1 185歳~93 3 7 3 2 2 2 6 0 3 1910歳~141 2 1 0 4 5 4 3 3 5 2015歳~192 2 3 1 0 1 4 5 2 6 2120歳~240 0 2 2 3 0 3 2 2 3 2225歳~291 1 3 2 3 1 1 3 2 6 2330歳~342 4 0 7 1 2 3 4 0 5 2435歳~391 1 0 0 5 2 2 3 1 2 2540歳~441 2 1 4 2 3 6 3 3 2 2645歳~491 2 3 1 0 1 4 9 3 0 2750歳~541 1 3 4 5 2 4 0 1 4 2855歳~590 2 1 1 6 2 7 3 0 3 2960歳~642 0 2 3 7 1 2 3 1 2 3065歳~692 1 2 2 1 0 2 5 2 4 3170歳~740 0 0 1 2 1 3 0 0 7 3275歳~791 3 4 1 1 1 2 3 2 2 3380歳~841 5 3 2 1 2 0 2 6 3 3485歳~894 2 4 1 0 1 1 1 3 3 3590歳~940 0 1 2 3 3 5 5 0 2 3695歳~991 1 4 2 0 0 2 5 1 4 37100歳以上 6 5 3 5 7 4 11 5 2 8

投稿2021/04/27 04:43

編集2021/04/27 05:57
ppaul

総合スコア24670

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

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

TakaiY

2021/04/27 05:12 編集

中身もこうすればもっとすっきりしますかね? [((df['転入時年齢'] >= x )&(df['転入時年齢'] <= x+4)).sum() for x in range(0, 100, 5)] + [((df['転入時年齢'] >= 100)).sum()] ★★ 95だと95が入らなくなってしまう。 いっそ100にしようかということで修正
takkucook

2021/04/27 05:04

それもできれば聞きたいと思っていました!!! 試してみます。ありがとうございます。
TakaiY

2021/04/27 05:13

ちょっと直しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問