2013-08-09 2 views
2

У меня есть два DataFrames. Первый df0:Функция капель панды: неуправляемая булева серия

Name  CHR MAPINFO  PMG   APA 
cg13869341 1 15865 0.8954256 0.8409144 
cg14008030 1 18827 0.5941512 0.712414 
cg12045430 1 29407 0.1110794 0.1302404 
cg20826792 1 29425 0.177532 0.1304049 
cg00381604 1 29435 0.09003246 0.04180672 
cg20253340 1 68849 0.4738799 0.444899 

конца второго df1:

probe Chromosome Gstart Gend 
A_23_P11744  1 4363 39806 
A_33_P3365932 1 4363 39806 
A_32_P923011 1 24554 46081 

Я хотел бы перебрать df0 [ «MAPINFO»] и уронить строки, которые не соответствуют условию и добавлять средства к другому ДФ. Мой код, как следует:

for pos in df0['MAPINFO']: 
    cond = ((pos < df1['Gstart']) & (pos > df1['Gend'])) 
    print df0.drop(df0[cond].index.values).mean(axis=0, skipna=True, level=None) 

который выдает следующее сообщение об ошибке:

/usr/lib64/python2.7/site-packages/pandas-0.12.0-py2.7-linux-x86_64.egg/pandas/core/frame.py:2021: UserWarning: Boolean Series key will be reindexed to match DataFrame index. 
"DataFrame index.", UserWarning) 
Traceback (most recent call last): 
File "/home/ferreirafm/bin/cpg_means.py", line 239, in <module> 
main() 
File "/home/ferreirafm/bin/cpg_means.py", line 231, in main 
import2df(infprobe, infchrom) 
File "/home/ferreirafm/bin/cpg_means.py", line 20, in import2df 
df0.drop(df0[cond].index.values)#.mean(axis=0, skipna=True, level=None) 
File "/usr/lib64/python2.7/site-packages/pandas-0.12.0-py2.7-linux-x86_64.egg/pandas/core/frame.py", line 1995, in __getitem__ 
return self._getitem_array(key) 
File "/usr/lib64/python2.7/site-packages/pandas-0.12.0-py2.7-linux-x86_64.egg/pandas/core/frame.py", line 2027, in _getitem_array 
key = _check_bool_indexer(self.index, key) 
File "/usr/lib64/python2.7/site-packages/pandas-0.12.0-py2.7-linux-x86_64.egg/pandas/core/indexing.py", line 1017, in _check_bool_indexer 
raise IndexingError('Unalignable boolean Series key provided') 
pandas.core.indexing.IndexingError: Unalignable boolean Series key provided 

Я почти уверен, что такой кусок кода, используемые для работы в предыдущей версии Панды. Однако я не могу понять, что происходит не так. Любая помощь приветствуется.

Ожидаемые результаты: Обратите внимание, что последняя строка df0 будет удалена, так как df1 'MAPINFO' первой строки (15865) находится за пределами диапазона gfart и Gend. Таким образом, результаты станут средством по столбцам незаброшенных линий из df0 (средства PGM и APA). То есть, в результате чего DF будет:

Name  CHR MAPINFO  PMG   APA 
cg13869341 1 15865 0.8954256 0.8409144 
cg14008030 1 18827 0.5941512 0.712414 
cg12045430 1 29407 0.1110794 0.1302404 
cg20826792 1 29425 0.177532 0.1304049 
cg00381604 1 29435 0.09003246 0.04180672 

В последней строке из DF0 «cg20253340 1 68849 0,4738799 0.444899» удаляется и средства по ряду берется.

+0

Что вы ожидаете ответа быть? Я не думаю, что этот код работал бы раньше. –

+0

вы пытаетесь индексировать df0 указателями из df1, это * может * работать, но действительно нечетно, поскольку логические индексы не равны по длине массиву, которые пытаются индексировать, поэтому это может быть обертка. вы наверняка получите неожиданный результат. – Jeff

+0

@ AndyHayden: Спасибо за комментарий. См. EDIT для ожидаемых результатов. – fred

ответ

1

Мое решение было бы сделать индекс Его, который реализует критерии включения, то просто использовать его:

import pandas as pd 

df0 = pd.DataFrame.from_records([["cg13869341", 1, 15865, 0.8954256, 0.8409144], 
           ["cg14008030", 1, 18827, 0.5941512, 0.712414], 
           ["cg12045430", 1, 29407, 0.1110794, 0.1302404], 
           ["cg20826792", 1, 29425, 0.177532, 0.1304049], 
           ["cg00381604", 1, 29435, 0.09003246, 0.04180672], 
           ["cg20253340", 1, 68849, 0.4738799, 0.444899]], 
           columns = ["Name", "CHR", "MAPINFO", "PMG", "APA"]) 

df1 = pd.DataFrame.from_records([["A_23_P11744", 1, 4363, 39806], 
           ["A_33_P3365932", 1, 4363, 39806], 
           ["A_32_P923011", 1, 24554, 46081]], 
           columns = ["probe", "Chromosome", "Gstart", "Gend"]) 

F = df0.MAPINFO.apply(lambda x: ((df1.Gstart <= x) & (x <= df1.Gend)).any()) 
print df0[F] ## as you exepected 

# mean by rows 
res = df0[F] 
res['mean'] = df0[F][['PMG', 'APA']].mean(1) 
print res 

# mean by columns 
print df0[F][['PMG', 'APA']].mean(0) 
+0

Спасибо за помощь. Ваше предложение отлично подходит для этих dfs. Я пытаюсь изменить ваш код, чтобы сразу применить функцию lambda для каждого MAPINFO. На самом деле, эти df огромны. – fred

+0

Во избежание недоразумений: Итерация MAPINFO уже является частью df.MAPINFO.apply, это скорее замена цикла. В этом отношении – lowtech

+0

Мне нужно адаптировать ваше предложение для моих нужд. Спасибо за помощь. – fred

Смежные вопросы