2017-10-05 67 views
1

我試圖將多個pandas.DataFrame連接在一個集合中保存在一個mongodb中,所有數據框都具有相同的索引/列和我想保存它,只需一個文件,使用to_json()方法。將數據框的所有單元格作爲字符串,它可能是一個好方法。爲了實現這個目標,我想Concat的這樣的dataframes:將兩個熊貓數據幀合併爲一個數據幀「字典型單元格」(pd.Panel已棄用)

df1:     
index A  B 
1  'A1' 'B1' 
2  'A2' 'B2' 
3  'A3' 'B3' 

df2: 
index A  B 
1 'a1' 'b1' 
2 'a2' 'b2' 
3 'a3' 'b3' 

預期的解決方案:

df_sol: 
index A     B 
1  {d1:'A1', d2:'a1'} {d1:'B1', d2:'b1'} 
2  {d1:'A2', d2:'a2'} {d1:'B2', d2:'b2'} 
3  {d1:'A3', d2:'a3'} {d1:'B3', d2:'b3'} 

,即時通訊使用的形式給出的

pd.Panel(dict(d1=df1, d2=df2)).apply(pd.Series.to_dict, 0) 

           A       B 
index              
1  {'d1': 'A1', 'd2': 'a1'} {'d1': 'B1', 'd2': 'b1'} 
2  {'d1': 'A2', 'd2': 'a2'} {'d1': 'B2', 'd2': 'b2'} 
3  {'d1': 'A3', 'd2': 'a3'} {'d1': 'B3', 'd2': 'b3'} 

pd.Panel其棄用DeprecationWarning : Panel is deprecated and will be removed in a future version.它有一個解決方法只使用pandas? 謝謝!

Original Question

回答

1

解決方案
pd.concat +其他的東西

pd.Series(
    pd.concat([df1, df2], axis=1, keys=['d1', 'd2']).stack().to_dict('index') 
).unstack() 

           A        B 
1 {'d1': ''A1'', 'd2': ''a1''} {'d1': ''B1'', 'd2': ''b1''} 
2 {'d1': ''A2'', 'd2': ''a2''} {'d1': ''B2'', 'd2': ''b2''} 
3 {'d1': ''A3'', 'd2': ''a3''} {'d1': ''B3'', 'd2': ''b3''} 

說明
我想[1, 2, 3]['A', 'B']到索引和['d1', 'd2']作爲列。

我開始pd.concat

pd.concat([df1, df2], axis=1, keys=['d1', 'd2']) 

     d1   d2  
      A  B  A  B 
index       
1  'A1' 'B1' 'a1' 'b1' 
2  'A2' 'B2' 'a2' 'b2' 
3  'A3' 'B3' 'a3' 'b3' 

幾乎讓我在那裏。如果我遵循了stack,它會掉落列的最後一層到索引中的最後一級:

pd.concat([df1, df2], axis=1, keys=['d1', 'd2']).stack() 

      d1 d2 
index    
1  A 'A1' 'a1' 
     B 'B1' 'b1' 
2  A 'A2' 'a2' 
     B 'B2' 'b2' 
3  A 'A3' 'a3' 
     B 'B3' 'b3' 

這就是我想要的。在這裏,我可以用.to_dict('index')

pd.concat([df1, df2], axis=1, keys=['d1', 'd2']).stack().to_dict('index') 

{(1, 'A'): {'d1': "'A1'", 'd2': "'a1'"}, 
(1, 'B'): {'d1': "'B1'", 'd2': "'b1'"}, 
(2, 'A'): {'d1': "'A2'", 'd2': "'a2'"}, 
(2, 'B'): {'d1': "'B2'", 'd2': "'b2'"}, 
(3, 'A'): {'d1': "'A3'", 'd2': "'a3'"}, 
(3, 'B'): {'d1': "'B3'", 'd2': "'b3'"}} 

,並傳遞迴pd.Series構造函數來得到一系列的字典。

pd.Series(
    pd.concat([df1, df2], axis=1, keys=['d1', 'd2']).stack().to_dict('index') 
) 

1 A {'d1': ''A1'', 'd2': ''a1''} 
    B {'d1': ''B1'', 'd2': ''b1''} 
2 A {'d1': ''A2'', 'd2': ''a2''} 
    B {'d1': ''B2'', 'd2': ''b2''} 
3 A {'d1': ''A3'', 'd2': ''a3''} 
    B {'d1': ''B3'', 'd2': ''b3''} 
dtype: object 

唯一剩下要做的就是unstack我顯示在上面的解決方案。

+0

在第一個選項中,第二個操作('groupby')失去了正確的索引,它有沒有辦法修復它? –

+1

從那以後我編輯過。我相信我現在擁有的是優越的。 – piRSquared

2

這是一個完全不同的概念,我很開心。


您可以創建一個dict的子類,我們在其中定義添加爲詞典合併。

from cytoolz.dicttoolz import merge 

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

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


df1.applymap(lambda x: mdict(d1=x)) + df2.applymap(lambda x: mdict(d2=x)) 

            A        B 
index                
1  {'d1': ''A1'', 'd2': ''a1''} {'d1': ''B1'', 'd2': ''b1''} 
2  {'d1': ''A2'', 'd2': ''a2''} {'d1': ''B2'', 'd2': ''b2''} 
3  {'d1': ''A3'', 'd2': ''a3''} {'d1': ''B3'', 'd2': ''b3''}