Pandas 元数据与多索引列数据帧的使用

Pandas 元数据与多索引列数据帧的使用,pandas,Pandas,我制作了一些软件,用于处理数据进行分析和绘图。对于每种类型的数据,数据帧在该类型专用的模块中生成。 根据数据的结构,数据帧列可以是普通列或多索引列。 我将把数据帧传递给一个过程函数,该函数将生成数值列的绘图 我希望能够“附加”一个字符串到每个“可打印”列,并使用一个字符串作为打印标签。此字符串将与列的名称不同 我似乎无法找到一个好方法来完全使用pandas DataFrame实现这一点,到目前为止,我也没有任何其他解决方案 我看到过关于元数据的帖子,但我不完全理解是否支持此功能?至少我没有做到这

我制作了一些软件,用于处理数据进行分析和绘图。对于每种类型的数据,数据帧在该类型专用的模块中生成。 根据数据的结构,数据帧列可以是普通列或多索引列。 我将把数据帧传递给一个过程函数,该函数将生成数值列的绘图

我希望能够“附加”一个字符串到每个“可打印”列,并使用一个字符串作为打印标签。此字符串将与列的名称不同

我似乎无法找到一个好方法来完全使用pandas DataFrame实现这一点,到目前为止,我也没有任何其他解决方案

我看到过关于元数据的帖子,但我不完全理解是否支持此功能?至少我没有做到这一点,尤其是使用带有多索引列的框架会使事情复杂化。 如果不支持,它是否仍在待办事项列表中? 从我的阅读中,我得到的印象是,它在不同版本的pandas中的工作方式不同,甚至取决于是否使用python 2或3。 我想知道是否有一种方便的方法来实现我对熊猫数据帧的要求?是否建议为此使用_元数据?如果是,怎么做

我环顾了很多地方,但特别是多索引问题似乎没有得到解决

这一条似乎表明应该支持元数据,但它是用于数据帧的吗?我需要数据帧中的序列。

这一个似乎是一个类似的问题,但我尝试了解决方案,它没有帮助,我尝试了解决方案,但它似乎没有帮助我。

以下是基于我对元数据功能使用的理解而做的一些实验。这似乎表明_元数据没有任何区别,并且该属性没有保留副本。它还表明,使用多索引是一种更“不受支持”的情况

win32上的Python 2.7.9(默认,2014年12月10日12:24:55)[MSC v.1500 32位(英特尔)] 有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。 >>>作为pd进口熊猫 >>>从numpy.random import randn#获取测试帧的值 >>>导入平台#以打印python版本 >>>#设置列标签的函数 >>>def标签机(aDF): ... DFtmp=aDF.copy()#只是为了确保它是不同的数据帧 ... 对于DFtmp.columns中的列: ... DFtmp[column].myLab='这是'+column.\uuu str\uuu() ... DFtmp[column].notMyLab='这不应该持续存在' ... 返回DFtmp ... >>> >>>打印“熊猫版本:{}”。格式(pd.version.version) 熊猫版本:0.15.2 >>> >>>pd.Series._metadata.append('myLab');打印pd.Series._元数据#现在_元数据包含“myLab” ['name','myLab'] >>> >>>#使数据帧成为普通列和多索引 >>>dfS=pd.DataFrame(randn(2,6),列=['a1','a2','a3','b1','b2','c1'];打印dfS a1 a2 a3 b1 b2 c1 0 -0.934869 -0.310979 0.362635 -0.994605 -0.880114 -1.663265 1 0.205341 -1.642080 -0.732969 -0.080109 -0.082483 -0.208360 >>> >>>dfMI=pd.DataFrame(randn(2,6),列=['a','a','a','b','b','c'],['a1','a2','a3','b1','b2','c1'];打印dfMI a、b、c a1 a2 a3 b1 b2 c1 0 -0.578399 0.478925 1.047342 -0.087225 1.905074 0.146105 1 0.640575 0.153328 -1.117847 1.043026 0.671220 -0.218550 >>> >>>#在数据帧上运行labelSetter功能 >>>dfSWlab=标签设置器(dfS) >>>dfMIWlab=标签机(dfMI) >>> >>>打印dfSWlab['a2'].myLab 这是a2 >>>这起作用了 >>> >>>打印dfSWlab['a2'].notMyLab 这种情况不应持续下去 >>>#“notMyLab”尚未附加到_元数据,但标签仍然存在。 >>> >>>dfSWlabCopy=dfSWlab.copy()#复制一份以查看myLab是否持续存在。 >>> >>>dfSWlabCopy['a2'].myLab 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“C:\Python27\lib\site packages\pandas\core\generic.py”,第1942行,在\uuu getattr中__ 返回对象。\uuuGetAttribute(self,name) AttributeError:“Series”对象没有属性“myLab” >>>#“myLab”已附加到_元数据,但仍然没有保留副本 >>> >>>打印dfMIWlab['a']['a2'].myLab 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“C:\Python27\lib\site packages\pandas\core\generic.py”,第1942行,在\uuu getattr中__ 返回对象。\uuuGetAttribute(self,name) AttributeError:“Series”对象没有属性“myLab” >>>#对于多索引数据帧,“myLab”不可访问
为什么不将数据框和标签作为两个单独的参数传递给plotting函数<代码>\u元数据仍然有效。感谢您的建议!我想,如果有方便的方法将这些信息添加到数据帧本身,我将不得不这样做。关于元数据支持的讨论似乎已经进行了很长时间,所以我希望我错过了一些东西。开发是通过拉请求(PRs)完成的。如果制定了引用问题的请购单,则会自动将链接添加到,如果请购单被接受并关闭问题,则问题将被标记为“已关闭”。因此,一般来说,您可以从问题页面监控开发状态。很好!但愿我早一点看到那个。
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> from numpy.random import randn  # To get values for the test frames
>>> import platform  # To print python version
>>> # A function to set labels of the columns
>>> def labelSetter(aDF) :
...     DFtmp = aDF.copy()  # Just to ensure it is a different dataframe
...     for column in DFtmp.columns :
...         DFtmp[column].myLab='This is '+column.__str__()
...         DFtmp[column].notMyLab='This should not persist'
...     return DFtmp
...
>>>
>>> print 'Pandas version: {}'.format(pd.version.version)
Pandas version: 0.15.2
>>>
>>> pd.Series._metadata.append('myLab');print pd.Series._metadata # now _metadata contains 'myLab'
['name', 'myLab']
>>>
>>> # Make dataframes normal columns and MultiIndex
>>> dfS=pd.DataFrame(randn(2, 6),columns=['a1','a2','a3','b1','b2','c1']);print dfS
         a1        a2        a3        b1        b2        c1
0 -0.934869 -0.310979  0.362635 -0.994605 -0.880114 -1.663265
1  0.205341 -1.642080 -0.732969 -0.080109 -0.082483 -0.208360
>>>
>>> dfMI=pd.DataFrame(randn(2, 6),columns=[['a','a','a','b','b','c'],['a1','a2','a3','b1','b2','c1']]);print dfMI
          a                             b                   c
         a1        a2        a3        b1        b2        c1
0 -0.578399  0.478925  1.047342 -0.087225  1.905074  0.146105
1  0.640575  0.153328 -1.117847  1.043026  0.671220 -0.218550
>>>
>>> # Run the labelSetter function on the data frames
>>> dfSWlab=labelSetter(dfS)
>>> dfMIWlab=labelSetter(dfMI)
>>>
>>> print dfSWlab['a2'].myLab
This is a2
>>> # This worked
>>>
>>> print dfSWlab['a2'].notMyLab
This should not persist
>>> # 'notMyLab' has not been appended to _metadata but the label still persists.
>>>
>>> dfSWlabCopy=dfSWlab.copy() # make a copy to see if myLab persists.
>>>
>>> dfSWlabCopy['a2'].myLab
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 1942, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'Series' object has no attribute 'myLab'
>>> # 'myLab' was appended to _metadata but still did not persist the copy
>>>
>>> print dfMIWlab['a']['a2'].myLab
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 1942, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'Series' object has no attribute 'myLab'
>>> # For the MultiIndex data frame the 'myLab' is not accessible