59081


以下の様な処理を行いたいのですが、  
関数の処理の中で、  
呼び出し元のデータフレーム名を取得することは可能でしょうか？

それとも、関数の引数を増やし、  
予めデータフレーム名を取得して、  
それを渡してあげる必要がありますか？

[code]

    data20100105 = pd.read_csv("20100105.csv")
    
    data_get(data20100105)
    
    def data_get(data):
      ここで
    　「data20100105」
    　などの名前を取得したい
    
[/code]


CC BY-SA 4.0
2019-09-14T06:08:30.897
59059
2019-09-15T10:10:58.480
31764
question
python
データフレーム名を呼び出し先の関数で取得する方法


それがglobalな変数として定義/設定されているならば、変数名を得ることは可能かもしれません。

[How to print dataframe name in title of a
plot?](https://stackoverflow.com/q/54137694/9014308)  
解決マークの付いた、こんな回答があります。

> I found nice function here: ([Get the name of a pandas
> DataFrame](https://stackoverflow.com/q/31727333/9014308))
[code]

>     def get_df_name(df):
>         name =[x for x in globals() if globals()[x] is df][0]
>         return name
>  
[/code]

>
> It will help you.
[code]

>     def plot_dist(df,col):
>         ax=sns.countplot(x=col,data=df)
>         ax.set_title(get_df_name(df))
>  
[/code]

上記の変数名を得る記事の参照も含まれますが、この辺の記事を読み解くと、もう少し広い範囲でも取得できるかもしれません。  
[Get the name of a pandas
DataFrame](https://stackoverflow.com/q/31727333/9014308)  
ただしここの回答には以下の否定的なコメントが付いています。

> It will throw `'DataFrame' object has no attribute 'name'` when it doesn't
> assign any name

[Getting the name of a variable as a
string](https://stackoverflow.com/q/18425225/9014308)  
[Simpler way to create dictionary of separate
variables?](https://stackoverflow.com/q/2553354/9014308)  
[Can I print original variable's name in
Python?](https://stackoverflow.com/q/544919/9014308)

* * *

任意の名前を付ける直接的/標準的な方法は無いようです。

仕様のドキュメントの中には、そうした情報はありません。  
[Constructot - pandas.DataFrame](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.html)  
[Attributes and underlying data - DataFrame](https://pandas.pydata.org/pandas-
docs/stable/reference/frame.html#attributes-and-underlying-data)

一方で、昔から同様の要求はあって、議論がされていたようです。  
その関連でメタデータというものを追加の属性として定義できるのが分かったらしいですが、その後にデータフレームに対して何か操作を行って、結果のデータフレームが返された場合には、そのメタデータは含まれていないようです。

[DataFrames should have a name attribute. #447](https://github.com/pandas-
dev/pandas/issues/447)  
[Allow custom metadata to be attached to panel/df/series?
#2485](https://github.com/pandas-dev/pandas/issues/2485)

[Adding meta-information/metadata to pandas
DataFrame](https://stackoverflow.com/q/14688306/9014308)  
質問

> Is it possible to add some meta-information/metadata to a pandas DataFrame?  
>  For example, the instrument's name used to measure the data, the instrument
> responsible, etc.  
>  One workaround would be to create a column with that information, but it
> seems wasteful to store a single piece of information in every row!
>
> いくつかのメタ情報/メタデータをpandas DataFrameに追加することは可能ですか？  
>  たとえば、データの測定に使用される機器の名前、責任のある機器など。  
>  回避策の1つは、その情報を含む列を作成することですが、すべての行に1つの情報を格納するのは無駄に思えます！

回答

> Sure, like most Python objects, you can attach new attributes to a
> pandas.DataFrame:
[code]

>     import pandas as pd
>     df = pd.DataFrame([])
>     df.instrument_name = 'Binky'
>  
[/code]

>
> Note, however, that while you can attach attributes to a DataFrame,
> operations performed on the DataFrame (such as `groupby`, `pivot`, `join` or
> `loc` to name just a few) may return a new DataFrame without the metadata
> attached. Pandas does not yet have a robust method of propagating [metadata
> attached to DataFrames](https://github.com/pydata/pandas/issues/2485).
>
> Preserving the metadata in a file is possible. You can find an example of
> how to store metadata in an HDF5 file
> [here](https://stackoverflow.com/a/29130146/190597).
>
> もちろん、ほとんどのPythonオブジェクトと同様に、pandas.DataFrameに新しい属性を追加できます。
>
>
> ただし、属性をDataFrameにアタッチすることはできますが、DataFrameで実行された操作（`groupby`、`pivot`、`join`、`loc`など）は、メタデータが添付されていない新しいDataFrameを返す場合があります。
> Pandasには、DataFrameに添付されたメタデータを伝播する堅牢な方法がまだありません。
>
> ファイル内のメタデータを保持することは可能です。 ここで、HDF5ファイルにメタデータを保存する方法の例を見つけることができます。

同様のことは上記変数名取得の方で紹介した以下の記事にもあります。  
[Get the name of a pandas
DataFrame](https://stackoverflow.com/q/31727333/9014308)

> You can name the dataframe with the following, and then call the name
> wherever you like:
[code]

>     import pandas as pd
>     df = pd.DataFrame( data=np.ones([4,4]) )
>     df.name = 'Ones'
>  
>     print df.name
>     >>>
>     Ones
>  
[/code]

>
> Hope that helps.

幾つか、Upvoteされた否定的/注意的なコメントが付いています。

> For posterity, as of v 0.18.1 this does not survive pickling (for v 0.18.1
> use to_pickle/ read_pickle instead of save/load if trying to reproduce the
> GitHub comment).
>
> A workaround I found is to place your DataFrame's name in the index's name
> attribute (e.g. df.index.name = 'Ones'). This is maintained during pickling.
> This only works if your DataFrame's index is not already named something
> useful...
>
> This is a poor idea because if you as much as drop something, the returned
> object will no longer have a name attribute. It's tempting, but will create
> inexplicable errors down the line.
>
> Really veru bad idea. If you call df.name = Ones is the same than df['name]
> = 'Ones'. it means the valiues for that column will be 'One'. SO it is not a
> correct answer. You can stor your dataframes within a dictionary and use the
> key to identify them


CC BY-SA 4.0
2019-09-15T10:10:58.480
59081
2019-09-15T10:10:58.480
26370
59059
answer