如何将dict打印为pandas.Series

时间:2016-06-09 13:28:40

标签: python dictionary pandas printing

我有一些词典,我在我的一个包中使用,很容易pandas.Series。但是,我将它们保留为dicts只是因为.update方法,它们都会更改现有值并为dict添加新值。 pandas.Series.update仅更改值。所以我被迫使用dicts(至少我认为)。

拖动是因为使用打印功能打印时很难读取,因此我想为用户打印更好的打印。我知道如何做到这一点的唯一方法是创建一个仅用于打印dicts的功能,这是我想避免的。有没有什么事情我可以固有地改变dicts,以便在运行一些命令后,每个dict打印得更好?也许甚至可以很快将它们转换成只用于打印的熊猫系列,因为我的dicts非常小。像

这样的东西
def _print_dict(self):
    print(pd.Series(self))

然后我可以把它扔到某个地方,比如

dict.__print_method__ = _print_dict

如果__print_method__是打印dicts时打印函数调用的方法。

1 个答案:

答案 0 :(得分:3)

在Python3中,print是一个函数。在Python2.7中,print是一个语句,但如果您在脚本的顶部声明from __future__ import print_function,则print将成为一个函数。可以重新定义函数:

from __future__ import print_function
import pandas as pd
try: import builtins
except ImportError: import __builtin__ as builtins

def print(*args, **kwargs):
    args = [item if not isinstance(item, (dict,)) else pd.Series(item)
            for item in args]
    builtins.print(*args, **kwargs)


print({'cheese':'stilton', 'swallow':'african', 'ride':'coconuts'})
print(2,3,4, sep=' -- ')

产量

cheese      stilton
ride       coconuts
swallow     african
dtype: object
2 -- 3 -- 4

顺便说一句,dictdefined in C。特别是其__repr__defined in C。当__str__ method is empty时,默认使用__repr__生成对象的字符串表示。

C语言定义的对象的特殊方法(例如__str____repr__)无法进行monkeypatched:

dct = {'cheese':'stilton', 'swallow':'african', 'ride':'coconuts'}
def mystr(self):
    return str(pd.Series(self))

dct.__str__ = mystr

加注

AttributeError: 'dict' object attribute '__str__' is read-only

如果dct是Python定义的类的实例,则故事会有所不同。可以定义,覆盖或monkeypatched这些类的特殊方法:

import pandas as pd
class MyDict(dict):
    def __str__(self):
        return str(pd.Series(self))

dct = {'cheese':'stilton', 'swallow':'african', 'ride':'coconuts'}
mydct = MyDict(dct)
print(mydct)

产量

cheese      stilton
ride       coconuts
swallow     african
dtype: object

但要使用此功能,需要将所有词组更改为MyDicts。这比重新定义print函数要困难得多。

(顺便提一下,请注意hidden pitfalls to subclassing dict properly。例如,如果您重新定义__setitem__而非update,则update将不会调用您的__setitem__方法。)