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

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

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

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

pandas

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

Q&A

解決済

2回答

928閲覧

[Python] 関数の引数へ複数のDataFrameを渡して変数名を表示する方法

HelloQ

総合スコア81

Python

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

pandas

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

0グッド

0クリップ

投稿2021/01/04 00:46

関数の引数へ複数(その時々によって変わる)のDataFrameを渡してshapeをprintしたいです。
どのようにするれば良いのか教えて頂けると幸いです。

python

1print_shape(**args): 2 for i in args: 3 print(i.shape) 4 5print_shape(df_tokyo, df_osaka, df_gunma) 6print_shape(df_hello, df_amerika, df_hakone, df_tochigi)

上3行を変更して、以下のような結果を得たいです。

df_tokyo shape: (100, 1), df_osaka shape: (100, 1), df_gunma shape: (100, 1)
df_hello shape: (100, 1), df_amerika shape: (100, 1), df_hakone shape: (100, 1), df_tochigi shape: (100, 1)

なるべく簡潔にしたいことから、print_shapeに新たに変数名のリストなどを渡すということはしたくないです。
そのようなことは可能でしょうか。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

こんな感じでどうでしょうか! この記事を参考にしました。

関数部分

from inspect import currentframe def print_shape(* args): names = {id(v):k for k,v in currentframe().f_back.f_locals.items()} print( "\n".join( names.get(id(arg),'???') + ": " + repr(arg.shape) for arg in args ) )

全体(test.py

import pandas as pd import numpy as np from inspect import currentframe def print_shape(* args): names = {id(v):k for k,v in currentframe().f_back.f_locals.items()} print( "\n".join( names.get(id(arg),'???') + ": " + repr(arg.shape) for arg in args ) ) def main(): df_tokyo = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD' )) df_osaka = pd.DataFrame(np.random.randint(0,100,size=(100, 5)), columns=list('ABCDE')) df_gumna = pd.DataFrame(np.random.randint(0,100,size=( 10, 4)), columns=list('ABCD' )) print_shape(df_tokyo, df_osaka, df_gumna) if __name__ == "__main__": main()

出力

$ python test.py df_tokyo: (100, 4) df_osaka: (100, 5) df_gumna: (10, 4)

追加、

すみません、投稿者さまのように横一列に表示したければ、

from inspect import currentframe def print_shape(* args): names = {id(v):k for k,v in currentframe().f_back.f_locals.items()} print( ", ".join( names.get(id(arg),'???') + " shape: " + repr(arg.shape) for arg in args ) )

としてください!

投稿2021/01/04 03:15

編集2021/01/04 03:22
BOLTE

総合スコア26

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

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

ppaul

2021/01/04 08:35

方法としてはこの方法しかないのですが、以下の問題は解決できないのですね。 df_tokyo2 = df_tokyo とした後に、 print_shape(df_tokyo, df_osaka, df_gumna) print_shape(df_tokyo2, df_osaka, df_gumna) を実行すると、どちらも同じ結果を出力する。 これはそういうものなのでしかたがないとあきらめましょう。
guest

0

ベストアンサー

しかたがないのであきらめましょう、とコメントしたように、この問題には完全な答えはないと思います。
同じオブジェクトを二つ以上の変数に入れるのを避ければ、BOLTEさんの回答で十分です。

一方、ユーザが書いたソースファイルの中身を読めば、引数の文字列を調べて表示することも不可能ではないなと思って作ってみました。
現在のフレームの一つ前のフレーム、つまり呼び出し元のフレームからファイル名と行番号を取り出し、ソースファイルを見て正規表現で引数の文字列に分解しています。
ソースがファイルに格納されていないと使えないので、これも完全な答えではありません。

ご参考まで

python

1import pandas as pd 2import inspect 3import re 4 5def get_line(file, no): 6 with open(file, "r") as f: 7 for i in range(no): 8 line = f.readline() 9 return line 10 11def find_argnames(fname, line): 12 m = re.search(fname + '[^(]*(([^)]*))', line) 13 return [v.strip() for v in m.groups()[0].split(',')] 14 15def print_shape(*dfs): 16 fname = "print_shape" 17 f = inspect.currentframe().f_back 18 names = find_argnames(fname, get_line(f.f_code.co_filename, f.f_lineno)) 19 print(', '.join(f'{name} shape: {df.shape}' for name, df in zip(names, dfs))) 20 21if __name__ == '__main__': 22 df_hello = pd.DataFrame({'John': list(range(100))}) 23 df_amerika = pd.DataFrame({'Eric': list(range(100))}) 24 df_hakone = pd.DataFrame({'Graham': list(range(100))}) 25 df_tochigi = pd.DataFrame({'Terry': list(range(100))}) 26 27 print_shape(df_hello, df_amerika, df_hakone, df_tochigi) 28

実行結果は以下です。

python

1> python test.py 2df_hello shape: (100, 1), df_amerika shape: (100, 1), df_hakone shape: (100, 1), df_tochigi shape: (100, 1)

投稿2021/01/07 07:32

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問