获取 pandas DataFrame 的名称

111

如何获取 DataFrame 的名称并将其作为字符串打印?

示例:

boston(变量名分配给一个 csv 文件)

import pandas as pd
boston = pd.read_csv('boston.csv')

print('The winner is team A based on the %s table.) % boston

1
你是指变量名吗? - Anand S Kumar
3
值得阅读 这篇文章这篇文章,以及其中的评论和链接。 - Matt Hall
8个回答

90
你可以使用以下方式为数据框命名,然后在需要的地方调用该名称即可:
import pandas as pd
df = pd.DataFrame( data=np.ones([4,4]) )
df.name = 'Ones'

print df.name
>>>
Ones

3
我需要将名称作为一个变量。导入pandas库并创建一个4x4的数据框。然后将数据框的名称设置为'df',并打印该名称以验证设置是否成功。import pandas as pd df = pd.DataFrame( data=np.ones([4,4]) ) df.name = 'df'print df.name
df
- leo
13
为了后人记录,截至 v 0.18.1 版本,这个功能不能被序列化 (如果尝试重现 GitHub 评论,请使用 to_pickle/ read_pickle 替代 save/load) 。请注意不要改变原文意思。 - tmthydvnprt
7
我找到的解决方法是将你的“DataFrame”的名称放置在索引的名称属性中(例如,df.index.name = 'Ones')。 这在pickling期间保持不变。 只有当您的“DataFrame”索引未命名为有用的内容时,此方法才有效。 - tmthydvnprt
13
这个想法很糟糕,因为如果你只是“掉落”了某样东西,返回的对象就不再具有“名称”属性了。虽然很诱人,但会在今后产生难以解释的错误。 - sapo_cosmico
10
这个想法真的很糟糕。如果你调用 df.name = Ones,与 df['name'] = 'Ones' 是一样的,那么该列的值将会变成 'One'。所以这不是一个正确的答案。你可以将你的数据框存储在一个字典中,并使用键来对它们进行标识。 - user2270655
显示剩余2条评论

56
有时df.name会不起作用。
你可能会收到以下错误消息:
'DataFrame'对象没有属性'name'
尝试以下函数:
def get_df_name(df):
    name =[x for x in globals() if globals()[x] is df][0]
    return name

5
如果没有给DataFrame赋任何名称,它将会抛出'DataFrame' object has no attribute 'name'的错误。 - Mohamed Thasin ah
7
为了确保人们不会混淆:这段代码的作用是查找当前所有已定义的全局变量中的数据框,并返回其变量名。这并不保证一定有效(例如,如果您的DF是局部变量),并且没有错误处理机制。只有在您确定自己在做什么时才应使用此代码! - Zecong Hu
放松点,伙计。这只是一个解决方案的建议。 然而,我有一个情况,就是这段代码片段不起作用。 - GenDemo

30
在许多情况下,不需要将自定义属性附加到pd.DataFrame对象上。此外,请注意pandas对象属性可能无法序列化。因此,pickling会丢失这些数据。
相反,考虑创建一个具有适当命名键的字典,并通过dfs['some_label']访问数据框。
df = pd.DataFrame()

dfs = {'some_label': df}

20

数据框没有名称,但你可以使用一个(实验性的)属性字典。例如:

df.attrs['name'] = "My name"   # Can be retrieved later

某些操作会保留属性。


1
在序列化之后使用 df.attrs['name'] 是可行的。非常好的答案。 - Leonardo
感谢您向大家通报这个新功能。在 series.attrs 和 dataframe.attrs 中,属性字典都可以工作,并且可以包含任意数量的要绑定在属性字典中的属性。 - Rich Lysakowski PhD
1
不客气。正如所述,Pandas 表示这是一个“实验性”的功能,希望他们不会对其进行太多更改或删除。 - creanion

15

根据这里的介绍,我了解到DataFrame是什么:

DataFrame是一个二维标记数据结构,其列可能具有不同的类型。您可以将其视为电子表格或SQL表,或一组Series对象的字典。

而Series则是:

Series是一个能够容纳任何数据类型(整数、字符串、浮点数、Python对象等)的一维标记数组。

Series具有一个可以像这样访问的name属性:

 In [27]: s = pd.Series(np.random.randn(5), name='something')

 In [28]: s
 Out[28]: 
 0    0.541
 1   -1.175
 2    0.129
 3    0.043
 4   -0.429
 Name: something, dtype: float64

 In [29]: s.name
 Out[29]: 'something'

编辑:根据原帖作者的评论,我认为原帖作者可能在寻找类似于以下内容:

 >>> df = pd.DataFrame(...)
 >>> df.name = 'df' # making a custom attribute that DataFrame doesn't intrinsically have
 >>> print(df.name)
 'df'

2
我需要将名称作为变量,类似于 name=<表名>。 - leo
2
什么是变量?比如调用 df 会打印出名称 "df" 而不是打印数据框本身? - dhuang
5
没错,那就是我想表达的意思。 - leo
但是你想如何命名数据框呢? - dhuang
4
文件名为apple.csv,我希望它被打印成“该文件来自apple。”——只有apple需要根据csv文件的名称动态更改。 - leo
2
@leo,这个问题有解决方案吗?你能得到不带引号的数据框名称吗? - IndigoChild

2

我正在开发一个特征分析模块,和你一样,我需要生成一个报告,包含正在分析的 pandas.Dataframe 的名称。为了解决这个问题,我使用了 @scohe001 和 @LeopardShark 在 https://dev59.com/42Ml5IYBdhLWcg3wa2XV#18425523 中提出的方案,并使用了 inspect 库进行实现:

import inspect

def aux_retrieve_name(var):
    callers_local_vars = inspect.currentframe().f_back.f_back.f_locals.items()
    return [var_name for var_name, var_val in callers_local_vars if var_val is var]

请注意额外的 .f_back 表示因为我打算从另一个函数中调用它:
def header_generator(df):
    print('--------- Feature Analyzer ----------')
    print('Dataframe name: "{}"'.format(aux_retrieve_name(df)))
    print('Memory usage: {:03.2f} MB'.format(df.memory_usage(deep=True).sum() / 1024 ** 2))
    return

使用给定的数据框运行此代码,我得到以下输出:

header_generator(trial_dataframe)

--------- 特征分析器 ----------
数据框名称:"trial_dataframe"
内存使用量:63.08 MB


1
这里是一个示例函数: 'df.name = file` :下面代码的第六行。
def df_list():
    filename_list = current_stage_files(PATH)
    df_list = []
    for file in filename_list:
        df = pd.read_csv(PATH+file)
        df.name = file
        df_list.append(df)
    return df_list

0
要在Python中获取DataFrame的变量名,你不能直接使用原生的Python或pandas属性来实现。然而,你可以通过检查globals()或locals()字典来匹配ID来使用一个变通方法。下面是一个可以找到DataFrame名称的函数:
def find_df_name(df):
   name = [name for name, obj in globals().items() if id(obj) == id(df)]
   return name[0] if name else None

使用方法:

df_name = find_df_name(burnishing_defects)
print(df_name)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接