gpt4 book ai didi

python - Pandas 是否允许自定义对象作为列标签?

转载 作者:行者123 更新时间:2023-11-28 19:17:09 30 4
gpt4 key购买 nike

在 Pandas 中,我一直使用自定义对象作为列标签,因为它们为特定于列的信息/方法提供了丰富/灵活的功能。例如,您可以设置一个自定义的 fmt_fn 来格式化每一列(注意这只是一个例子,我实际的列标签对象更复杂):

In [100]: class Col:
...: def __init__(self, name, fmt_fn):
...: self.name = name
...: self.fmt_fn = fmt_fn
...: def __str__(self):
...: return self.name
...:

In [101]: sec_col = Col('time', lambda val: str(timedelta(seconds=val)).split('.')[0])

In [102]: dollar_col = Col('money', lambda val: '${:.2f}'.format(val))

In [103]: foo = pd.DataFrame(np.random.random((3, 2)) * 1000, columns = [sec_col, dollar_col])

In [104]: print(foo) # ugly
time money
0 773.181402 720.997051
1 33.779925 317.957813
2 590.750129 416.293245

In [105]: print(foo.to_string(formatters = [col.fmt_fn for col in foo.columns])) # pretty
time money
0 0:12:53 $721.00
1 0:00:33 $317.96
2 0:09:50 $416.29

好吧,我很高兴这样做了一段时间,但最近我发现 Pandas 的一部分不支持这个。具体来说,方法 to_hdf/read_hdf will fail在具有自定义列标签的 DataFrame 上。这对我来说不是一个破坏者。我可以使用 pickle 代替 HDF5,但会损失一些效率。

但更大的问题是,Pandas 通常支持自定义对象作为列标签吗?换句话说,我应该继续以这种方式使用 Pandas,还是将来 Pandas 的其他部分(除了 HDF5)会出现问题,给我带来 future 的痛苦?

附言。作为旁注,我不介意你是否也插话你如何解决列特定信息的问题,例如上面示例中的 fmt_fn,如果你当前没有使用自定义对象作为列标签。

最佳答案

DataFrame 的格式进行细粒度控制目前还不可能。例如,参见 herehere一些可能性的讨论。我确信经过深思熟虑的 API(和 PR!)会很受欢迎。

就使用自定义对象作为列而言,两个最大的问题可能是序列化和索引语义(例如,不能再做 df['time'])。

一种可能的解决方法是将您的 DataFrame 包装成某种 pretty-print 结构,如下所示:

In [174]: class PrettyDF(object):
...: def __init__(self, data, formatters):
...: self.data = data
...: self.formatters = formatters
...: def __str__(self):
...: return self.data.to_string(formatters=self.formatters)
...: def __repr__(self):
...: return self.__str__()


In [172]: foo = PrettyDF(df,
formatters={'money': '${:.2f}'.format,
'time': lambda val: str(timedelta(seconds=val)).split('.')[0]})


In [178]: foo
Out[178]:
time money
0 0:13:17 $399.29
1 0:08:48 $122.44
2 0:07:42 $491.72

In [180]: foo.data['time']
Out[180]:
0 797.699511
1 528.155876
2 462.999224
Name: time, dtype: float64

关于python - Pandas 是否允许自定义对象作为列标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32340611/

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