在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
好了,所以我一直在愉快地这样做了虽然,但是最近我遇到了不支持这个的熊猫的一部分。具体来说,使用自定义列标签的DataFrame上的方法to_hdf
/read_hdf
will fail。这对我来说不是一个破坏者。我可以使用咸菜而不是HDF5来减少一些效率。
但是更大的问题是,大熊猫一般是否支持自定义对象作为列标签?换句话说,我是否应该继续以这种方式使用熊猫,否则将来会在大熊猫的其他部分(除了HDF5)中破碎,给我带来未来的痛苦?
PS。作为一个方面说明,如果您目前还没有使用自定义对象作为列标签,我也不介意如何解决上述示例中列特定信息的问题,如fmt_fn
。
有趣的问题,因为我从来没有见过在一个数据帧列传递的对象。我会建议不要这样使用。如果您需要灵活性,您可以保留一个字段名称和底层对象的字典。 – Alexander
这将是糟糕的设计(海事组织)保持每个DataFrame单独的数据结构并行于'foo.columns',而不是简单地将列专用数据放入'foo.columns'。我只会在必要时这样做,即,如果Pandas真的不支持自定义对象作为列标签。因此我发布了这个问题。 – aiai
数据框的列只是一个索引。看来唯一的要求是对象是可散列的。 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.html – Alexander