2013-02-18 8 views
3

Во-первых, позвольте мне поставить сцену.Как вычесть один фрейм данных из другого?

я начать с pandas dataframe klmn, который выглядит следующим образом:

In [15]: klmn 
Out[15]: 
    K L   M N 
0 0 a -1.374201 35 
1 0 b 1.415697 29 
2 0 a 0.233841 18 
3 0 b 1.550599 30 
4 0 a -0.178370 63 
5 0 b -1.235956 42 
6 0 a 0.088046 2 
7 0 b 0.074238 84 
8 1 a 0.469924 44 
9 1 b 1.231064 68 
10 2 a -0.979462 73 
11 2 b 0.322454 97 

Далее я разделил klmn на две dataframes, klmn0 и klmn1, в соответствии со значением в столбце 'K':

In [16]: k0 = klmn.groupby(klmn['K'] == 0) 
In [17]: klmn0, klmn1 = [klmn.ix[k0.indices[tf]] for tf in (True, False)] 
In [18]: klmn0, klmn1 
Out[18]: 
( K L   M N 
0 0 a -1.374201 35 
1 0 b 1.415697 29 
2 0 a 0.233841 18 
3 0 b 1.550599 30 
4 0 a -0.178370 63 
5 0 b -1.235956 42 
6 0 a 0.088046 2 
7 0 b 0.074238 84, 
    K L   M N 
8 1 a 0.469924 44 
9 1 b 1.231064 68 
10 2 a -0.979462 73 
11 2 b 0.322454 97) 

Наконец, я вычислил среднее значение столбца M в klmn0, сгруппированное по значению в L колонка:

In [19]: m0 = klmn0.groupby('L')['M'].mean(); m0 
Out[19]: 
L 
a -0.307671 
b 0.451144 
Name: M 

Теперь мой вопрос, как я могу вычесть m0 из M колонки klmn1 югу dataframe, уважая значение в столбце L? (Под этим я имею в виду, что m0['a'] получает вычитается из M столбца каждой строки в klmn1, который имеет 'a' в L колонки, а также для m0['b'].)

Можно представить себе делать это таким образом, что заменяет значения в столбце Mklmn1 с новыми значениями (после вычитания значения от m0). В качестве альтернативы можно было бы сделать это таким образом, чтобы оставить klmn1 без изменений и вместо этого создает новый информационный фрейм klmn11 с обновленным столбцом M. Меня интересуют оба подхода.

+0

Кстати, я несчастна с кодом Раньше я делил 'klmn' на' klmn0' и 'klmn1'. В частности, представляется громоздким прибегать к пониманию, повторяющемуся над '(True, False)', чтобы попасть в два суб-dataframes. Есть ли какое-то индексирующее выражение 'klmn [...]' или 'klmn.ix [...]', которое использует объект 'groupby'' k0' непосредственно для извлечения суб-данных? – kjo

ответ

6

Если сбросить индекс вашего klmn1 dataframe быть, что в колонке L, то ваш dataframe автоматически выравнивать индексы с любой серии вычесть из него:

In [1]: klmn1.set_index('L')['M'] - m0 
Out[1]: 
L 
a 0.777595 
a -0.671791 
b 0.779920 
b -0.128690 
Name: M 
1

Вариант № 1:

df1.subtract(df2, fill_value=0) 

Вариант № 2:

df1.subtract(df2, fill_value=None) 
Смежные вопросы