在MultiIndex列DataFrame中使用元数据

时间:2015-03-22 22:50:15

标签: pandas

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

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

我似乎无法找到一个纯粹使用pandas DataFrame完成此操作的方法,到目前为止我还没有任何其他解决方案。

我见过有关元数据的帖子,但我不完全明白是否支持此功能?至少我没有让它工作,特别是使用MultiIndex列的框架似乎使事情变得复杂。 如果它不受支持它仍然在待办事项清单上? 从我的阅读中我得到的印象是它在不同版本的熊猫中的工作方式不同,甚至取决于是否使用了python 2或3。 我想知道是否有一种方便的方法来完成我对Pandas数据帧的要求?是否正在使用_metadata?如果是这样的话?

我已经看了很多,但特别是MultiIndex问题似乎没有在任何地方解决。

这个似乎表明应该支持元数据,但它是否适用于数据框?我需要DataFrame中的Series。 Adding meta-information/metadata to pandas DataFrame

这个似乎是一个类似的问题,但我尝试了解决方案并没有帮助,我尝试了解决方案,但似乎没有帮助我。 Propagate pandas series metadata through joins

根据我对_metadata功能的使用的理解,我做了一些实验。它似乎表明_metadata没有任何区别,并且该属性没有保留副本。此外,它表明使用MultiIndex是一个更“不受支持”的情况。

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

0 个答案:

没有答案