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