2017-09-26 56 views
1

我聽說熊貓不能很好地處理單個單元格中的存儲列表或字典,但是我很努力地在上找到更多信息。爲什麼就是這種情況。在許多用例中,將更復雜的數據結構存儲在Pandas單元中會非常有用 - 比如字典 - 我如何以'熊貓式'的方式來做到這一點?這是否適用於所有可變數據結構?什麼是'熊貓式'數據結構存儲在DataFrame中?

+4

因爲當dtypes不是標量值時,您將失去執行向量化操作的任何可能性。它與可變數據結構無關。您獲得的所有內容都是檢索列和行的靈活性,但是例如,如果您想在包含列表的列中搜索值,則必須遍歷每行並測試,而不是簡單的'df ['col'] = = some_val' – EdChum

+0

想象一下,您在熊貓上進行的字典操作與使用字典元素的多個數據框上的類似操作進行的某種排序操作。 –

回答

0

這可能不是你要找的,因爲@EdChum是正確的。非常簡單,將非標量對象放入pd.Seriespd.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 

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 

甚至得到一個numpy的對象數組

df.applymap(dict_).values.sum() 

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

這還挺有趣!不知道這是如何「熊貓式」,但我喜歡它。