gpt4 book ai didi

python - 创建具有多个子类 Series 的 pandas 数据框

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:56 24 4
gpt4 key购买 nike

我想创建一个仅在某些列上实现自定义方法的 pandas 数据集。我知道您可以使用如下所示的子类覆盖默认的 pandas.Series 构造函数:

类子类系列(Series):

@property
def _constructor(self):
return SubclassedSeries

@property
def _constructor_expanddim(self):
return SubclassedDataFrame

类 SubclassedDataFrame(DataFrame):

@property
def _constructor(self):
return SubclassedDataFrame

@property
def _constructor_sliced(self):
return SubclassedSeries

Pandas - Internals - 包括有关 pandas 数据帧和系列对象子类化的信息。

我想要做的是创建一个条件构造函数,它使用列的名称来选择适当的 pandas.Series 子类。例如:

@property
def _constructor_sliced(self):
if column_name == 'ANN':
return AnnotationSeries
else:
return Series

问题是 pandas frame.py不向构造函数传递任何信息 - 仅传递 Series 对象(或子类化系列对象)。

最佳答案

让 pandas 根据其名称有条件地构造一个自定义系列,可以使用派生的 pandas.Series() 上的自定义 __new__ 方法来完成,例如:

代码:

class SubclassedSeries(pd.Series):

our_column_names = ('col2', )

def __new__(cls, *args, **kwargs):
if kwargs.get('name', None) in cls.our_column_names:
obj = object.__new__(cls)
obj.__init__(*args, **kwargs)
return obj
return pd.Series(*args, **kwargs)

@property
def _constructor(self):
return SubclassedSeries

@property
def _constructor_expanddim(self):
return SubclassedDataFrame

测试代码:

import pandas as pd

class SubclassedDataFrame(pd.DataFrame):

@property
def _constructor(self):
return SubclassedDataFrame


@property
def _constructor_sliced(self):
return SubclassedSeries

df = SubclassedDataFrame(dict(col1=[1, 2], col2=[3, 4]))
print(df)

print('---')
print(type(df.col1))
print(df.col1)
print('---')
print(type(df.col2))
print(df.col2)
print('---')

结果:

   col1  col2
0 1 3
1 2 4
---
<class 'pandas.core.series.Series'>
0 1
1 2
Name: col1, dtype: int64
---
<class '__main__.SubclassedSeries'>
0 3
1 4
Name: col2, dtype: int64
---

关于python - 创建具有多个子类 Series 的 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48435082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com