2015-11-18 4 views
2

У меня есть два pandas.DataFrame объектов с MultiIndex индексов. Некоторые значения индекса разделяются двумя файлами данных, но не все. Я хотел бы объединить эти два кадра данных и взять сумму одного из столбцов, если существует строка (значение индекса). В противном случае сохраните значение строки и столбца в том виде, в каком оно существует.pandas concat/merge and sum one column

: This is close, but does not use MultiIndex

Я попытался создать пример:

def mklbl(prefix,n): 
try: 
    return ["%s%s" % (prefix,i) for i in range(n)] 
except: 
    return ["%s%s" % (prefix,i) for i in n] 



mi1 = pd.MultiIndex.from_product([mklbl('A',4), mklbl('C',2)]) 

mi2 = pd.MultiIndex.from_product([mklbl('A',[2,3,4]), mklbl('C',2)]) 

df2 = pd.DataFrame({'b':np.arange(len(mi2)), 'c':np.arange(len(mi2))[::-1]}, 
     index=mi2).sort_index().sort_index(axis=1) 

df1 = pd.DataFrame({'a':np.arange(len(mi1)), 'b':np.arange(len(mi1))[::-1]}, 
     index=mi1).sort_index().sort_index(axis=1) 

Отдельные DataFrame объекты выглядят как:

In [117]: df1 
Out[117]: 
     a b 
A0 C0 0 7 
    C1 1 6 
A1 C0 2 5 
    C1 3 4 
A2 C0 4 3 
    C1 5 2 
A3 C0 6 1 
    C1 7 0 

и

In [118]: df2 
Out[118]: 
     b c 
A2 C0 0 5 
    C1 1 4 
A3 C0 2 3 
    C1 3 2 
A4 C0 4 1 
    C1 5 0 

То, что я хочу сделать, это объединить эти два, и суммировать столбец «B», но сохранить все строки, существуют ли они в той или иной dataframe:

In [117]: df_merged_bsummed 
Out[117]: 
     a b c 
A0 C0 0 7 NaN 
    C1 1 6 NaN 
A1 C0 2 5 NaN 
    C1 3 4 NaN 
A2 C0 4 3 5 
    C1 5 3 4 
A3 C0 6 3 3 
    C1 7 3 2 
A4 C0 NaN 4 1 
    C1 NaN 5 0 
+0

@DSM спасибо! Отредактировано ... – John

ответ

4

В данном случае, я думаю, вы могли бы просто добавить их и использовать fill_value=0, полагаясь на поведение ориентирующей по умолчанию:

>>> df1.add(df2,fill_value=0) 
     a b c 
A0 C0 0 7 NaN 
    C1 1 6 NaN 
A1 C0 2 5 NaN 
    C1 3 4 NaN 
A2 C0 4 3 5 
    C1 5 3 4 
A3 C0 6 3 3 
    C1 7 3 2 
A4 C0 NaN 4 1 
    C1 NaN 5 0 

Там быть только один столбец в общем, только один суммируется, но если вы хотите, чтобы сделать это явно можно вместо этого сделать что-то вроде

>>> m = pd.concat([df1, df2],axis=1) 
>>> m["b"] = m.pop("b").sum(axis=1) 
>>> m 
     a c b 
A0 C0 0 NaN 7 
    C1 1 NaN 6 
A1 C0 2 NaN 5 
    C1 3 NaN 4 
A2 C0 4 5 3 
    C1 5 4 3 
A3 C0 6 3 3 
    C1 7 2 3 
A4 C0 NaN 1 4 
    C1 NaN 0 5 
+0

есть ли способ сделать это, чтобы суммировать только столбцы b? – John