2016-10-20 5 views
1

私が定義したサブクラスを含むDataFrameを作成したいと思います。ただし、サブクラスはDataFrameに割り当てられている場合はSeriesから削除されているようです。ここでPython pandas:SeriesサブクラスをDataFrame列として保存

は、問題を説明するためにおもちゃの例です:

>>> import pandas as pd 
>>> class SeriesSubclass(pd.Series): 
...  @property 
...  def _constructor(self): 
...   return SeriesSubclass 
...  def times_two(self): 
...  """Method I need in this subclass.""" 
...   return self * 2 
... 
>>> subclass = SeriesSubclass([7, 8, 9]) 
>>> type(subclass)     # fine 
<class '__main__.SeriesSubclass'> 
>>> subclass.times_two()    # fine 
0 14 
1 16 
2 18 
dtype: int64 
>>> 
>>> data = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=list('ABC')) 
>>> data['D'] = subclass 
>>> type(data['D'])     # not good 
<class 'pandas.core.series.Series'> 
>>> data['D'].times_two()   # not good 
Traceback (most recent call last): 
    ... 
AttributeError: 'Series' object has no attribute 'times_two' 

私はこの問題は以前#1713提起されている可能性が見てきたが、私は、実際のソリューションを識別することはできません。そのような巨大なライブラリであり、さまざまなPR、docバージョンなどに従うのが難しいです。そして、サブクラス化の仕組みは、私が(this seems to be it)を伝える限りよく説明されていないようです。

答えて

0

あなた自身もpd.DataFrameサブクラスを定義していない限り、あなたは不運だと思います。そして、それはもっと難しい作業です。

は、この例

df = pd.DataFrame() 
s = pd.Series([1, 2, 3]) 
s.random_attribute = 'hello!' 
print(s.random_attribute) 

df['A'] = s 
print(df.A.random_attribute) 

hello! 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-273-e0031d933193> in <module>() 
     5 
     6 df['A'] = s 
----> 7 print(df.A.random_attribute) 

//anaconda/envs/3.5/lib/python3.5/site-packages/pandas/core/generic.py in __getattr__(self, name) 
    2742    if name in self._info_axis: 
    2743     return self[name] 
-> 2744    return object.__getattribute__(self, name) 
    2745 
    2746  def __setattr__(self, name, value): 

AttributeError: 'Series' object has no attribute 'random_attribute' 

df.Asではないことを検討してください。 df.Asから構築され、そのタイプは無視されます。

0

同様のニーズを持つ人にとっては、DataFrameのサブクラスを定義し、__getitem__ロジックで介入するのが最善の解決策だと思います。

私の元の質問は、DataFrameがコンテナとして実装されていることを前提としており、基本的にはそうではありません。これは、例えば...

したがって
>>> from pandas import Series, DataFrame 
>>> s = Series([1, 2, 3, 4], name='x') 
>>> df = DataFrame(s) 
>>> s is df.x 
False 

、よりダイナミックだ、Seriesのサブクラスとして列を取得するために、あなたは__getitem__をいじくり回す必要があります。

私は例として役立つかもしれない、私自身のパッケージでこれを実現していますhttps://github.com/jmackie4/activityio/blob/master/activityio/_util/types.py

私はもっとエレガントな解決策で誰からもかかわらず、聞くことに熱心になるだろう!

関連する問題