2014-09-18 3 views
1

Я хочу найти строки из pandas Dataframe_1, если значение в четвертом столбце внутри этой строки существует в любой строке всего первого столбца Dataframe_2. Мне нужно скопировать эти строки в новую таблицу.Pandas исключает строку из dataframe, если значение отсутствует в другом фрейме данных

EDIT

Здесь я также включают dataframes:

Dataframe_1:

  1  2    3 4 
0 
chr1 128611 128681 cuffs_1_128645 . 
chr1 186868 186933 cuffs_2_186901 . 
chr1 186978 187035 cuffs_3_187015 . 
chr1 187054 187122 cuffs_4_187082 . 
chr1 262712 262773 cuffs_5_262742 . 

Dataframe_2:

      1  2  3  4  5  6  7 8 
0 
cuffs_100001_101338862 1.24 3.11 1.86 11.19 5.59 8.08 0.62 0 
cuffs_100004_101354225 2.49 0.62 1.86 1.86 2.49 1.24 0.00 0 
cuffs_100045_101386584 14.92 14.92 3.11 10.57 5.59 15.54 0.62 0 
cuffs_100089_101719129 2.49 0.62 1.86 5.59 1.86 1.86 0.00 0 
cuffs_100111_101726996 6.84 0.00 3.73 3.11 6.84 2.49 0.62 0 

Оба dataframes импортируются из .csv и огромны , поэтому здесь я положил onl y несколько строк и столбцов.

Это то, что я пробовал:

import pandas as pd 
df1 = pd.DataFrame.from_csv(Dataframe_1, sep = '\t', index_col=list(range(0,1,2)), header = None) 
df2 = pd.DataFrame.from_csv(Dataframe_2, sep = '\t', index_col=list(range(0,1,2)), header = None) 
df1 = df1[df1[3] == df2[0]] 
df1.to_csv(fileout, sep = '\t', header = False) 

При выполнении этого я получаю (или около того) восемь строк ответа, ссылаясь на файлы пакета панд, index.pyx и hashtable.pyx, которые я не понимаю.

+0

Без примера набора данных из фреймов данных это затрудняет вам помощь. Однако, я думаю, вы можете попробовать: df1 = df1 [df1 [3] .isin (df2 [0])]. Если это не то, что вы ищете, отправьте копию и пример, пригодный для использования. – DataSwede

+0

Спасибо, я протестировал это, но он все же дал ту же связку строк ответа и «KeyError: 0', предположительно код KeyError изменяется, когда я меняю' df2 [0] 'на' df2 [2] 'например. Я становлюсь «KeyError: 2» соответственно. – Gvaihir

+0

Это связано с двусмысленностью оператора индекса. Будь конкретным, например, 'df.loc [:, 0]', чтобы получить первый столбец. – filmor

ответ

0

Понял! По-видимому, ни одна из проверенных команд для фильтрации, будь то df1 = df1[df1[3].isin(df2[0])] или df1 = df1[df1[3] == df2[0]], распознает столбцы «0», представляющие индексы строк. Выход будет импортировать Dataframe_2 назначая столбцы не нравится (0,1,2), а (1,2,3), это приведет к следующему форматированию df2:

      0  2  3  4  5  6  7 8  
1 
1.24 cuffs_100001_101338862 3.11 1.86 11.19 5.59 8.08 0.62 0 
2.49 cuffs_100004_101354225 0.62 1.86 1.86 2.49 1.24 0.00 0 
14.92 cuffs_100045_101386584 14.92 3.11 10.57 5.59 15.54 0.62 0 
2.49 cuffs_100089_101719129 0.62 1.86 5.59 1.86 1.86 0.00 0 
6.84 cuffs_100111_101726996 0.00 3.73 3.11 6.84 2.49 0.62 0 

Где " 0 "больше не является индексом для строк. Затем мы можем применить df1 = df1[df1[3].isin(df2[0])]. ПРИМЕЧАНИЕ: приложение df1 = df1[df1[3] == df2[0]] поднимет сообщение об ошибке Series lengths must match to compare

Спасибо!

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