在字典上合并pandas数据帧

时间:2018-01-01 20:11:21

标签: python pandas

我必须通过分层字典来关联数据帧。

In[0]: import pandas as pd

d = {'levelA_1':['sublevel_1', 'sublevel_2'],
     'levelA_2':['sublevel_3', 'sublevel_4'],
     'levelA_3':['sublevel_5', 'sublevel_6']}

datA = pd.DataFrame({'A': {'levelA_1': 4, 'levelA_2': 2, 'levelA_3': 2},
                     'B': {'levelA_1': 1, 'levelA_2': 3, 'levelA_3': 5},
                     'C': {'levelA_1': 2, 'levelA_2': 4, 'levelA_3': 6}})

datB = pd.DataFrame({'A': {'sublevel_1': 4, 'sublevel_2': 1, 'sublevel_3': 3, 'sublevel_4': 4},
                     'B': {'sublevel_1': 1, 'sublevel_2': 3, 'sublevel_3': 4, 'sublevel_4': 8},
                     'C': {'sublevel_1': 2, 'sublevel_2': 6, 'sublevel_3': 13, 'sublevel_4': 6}})

In[1]: datA
Out[1]:     
            A   B   C
levelA_1    4   1   2
levelA_2    2   3   4
levelA_3    2   5   6

In[2]: datB
Out[2]:
            A   B   C
sublevel_1  4   1   2
sublevel_2  1   3   6
sublevel_3  3   4   13
sublevel_4  4   8   6

In[3]: x = 3

第一个数据框(datA)为d提供值,而另一个(datB)提供值<的值/ {>的d

此外,我的基值为x。我想将datA的矩阵与x相乘,然后将datB的每个元素与引用的值(来自dict)相乘。

因此,例如,我想获得一个单元格的以下结果。

    x = 3
    3 * datB['B']['sublevel_3'] * datA['B']['levelA_2'] 

    # res = 3*4*3 = 36 

数据帧的所需输出:

            A   B   C
sublevel_1  48  3   12
sublevel_2  12  9   26
sublevel_3  18  36  156
sublevel_4  24  72  72

有没有比循环每个细胞更好的方法?

1 个答案:

答案 0 :(得分:0)

IIUC

datA['New']=datA.reset_index()['index'].map(d).values 
# map the dict , build the connecction for datA and datB
New_datA=datA.set_index(list('ABC'),append=True).New.apply(pd.Series).stack().reset_index(list('ABC'))
# makeing datA and datB have the same index, then we could do dataframe calculation
New_datA=New_datA.set_index(0)

datB*New_datA*3
#you can add dropna at the end to remove the NaN value
Out[95]: 
               A     B      C
sublevel_1  48.0   3.0   12.0
sublevel_2  12.0   9.0   36.0
sublevel_3  18.0  36.0  156.0
sublevel_4  24.0  72.0   72.0
sublevel_5   NaN   NaN    NaN
sublevel_6   NaN   NaN    NaN