什么是'panda-esque'数据结构存储在DataFrames中?

时间:2017-09-26 09:40:39

标签: python pandas data-structures

我听说大熊猫在单个单元格中存储列表或词典并不“很好”,但是我很难找到有关为什么这种情况的更多信息。在许多用例中,对于我来说,在Pandas单元格中存储更复杂的数据结构非常有用 - 比如字典 - 我将如何以“熊猫式”的方式进行此操作?这是否适用于所有可变数据结构?

1 个答案:

答案 0 :(得分:0)

这可能不是你想要的,因为@EdChum是对的。很简单,将非标量对象放入88 86 87 87 86 83 pd.Series单元格的原因很少。

考虑数据框pd.DataFrame

df

你最好使用嵌入式词典。

d1 = dict(a=1, b=2, c=3)
d2 = dict(d=1, e=2, f=3)
d3 = dict(g=1, h=2, i=3)
d4 = dict(j=1, k=2, l=3)
d5 = dict(m=1, n=2, o=3)
d6 = dict(p=1, q=2, r=3)

df = pd.DataFrame(dict(
    A=[d1, d2, d3],
    B=[d4, d5, d6]
))

df

                          A                         B
0  {'a': 1, 'b': 2, 'c': 3}  {'j': 1, 'k': 2, 'l': 3}
1  {'d': 1, 'e': 2, 'f': 3}  {'m': 1, 'n': 2, 'o': 3}
2  {'g': 1, 'h': 2, 'i': 3}  {'p': 1, 'q': 2, 'r': 3}

但是,如果要按行或列方式操作它们,可以编写d = df.to_dict() d['A'][0] {'a': 1, 'b': 2, 'c': 3} 的子类来定义添加

dict

然后你可以将值转换为这个新类......

from cytoolz.dicttoolz import merge

class dict_(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def __add__(self, other):
        return dict_(merge(self, other))

df.applymap(dict_).sum()

A    {'a': 1, 'b': 2, 'c': 3, 'd': 1, 'e': 2, 'f': ...
B    {'j': 1, 'k': 2, 'l': 3, 'm': 1, 'n': 2, 'o': ...
dtype: object

甚至可以获得一个numpy对象数组

df.applymap(dict_).sum(1)

0    {'a': 1, 'b': 2, 'c': 3, 'j': 1, 'k': 2, 'l': 3}
1    {'d': 1, 'e': 2, 'f': 3, 'm': 1, 'n': 2, 'o': 3}
2    {'g': 1, 'h': 2, 'i': 3, 'p': 1, 'q': 2, 'r': 3}
dtype: object

那真有趣!不知道“Pandas-esque”是怎么回事,但我喜欢它。