2013-07-11 3 views
1

У меня есть набор данных pandas плюс серия идентификаторов pandas и вы хотите отфильтровать строки из фрейма данных, соответствующие идентификаторам в серии. Чтобы получить идентификаторы из фрейма данных, мне нужно объединить его первые два столбца. Я пробовал различные вещи для фильтрации, но пока никто не работает. Вот что я пробовал:Фильтрация строк из фрейма данных pandas с использованием конкатенированных строк

1) Я попробовал добавить столбец булевых данных в фрейм данных, будучи истинным, если эта строка соответствует одному из идентификаторов и false в противном случае (надеясь, что после этого можно будет фильтровать, используя новый столбец):

df["isInAcids"] = (df["AcNo"] + df["Sortcode"]) in acids 

где

acids 

является серия, содержащий идентификаторы.

Однако это дает мне

TypeError: unhashable type 

2) Я пытался фильтрации с помощью функции применения:

df[df.apply(lambda x: x["AcNo"] + x["Sortcode"] in acids, axis = 1)] 

Это не дает мне ошибку, но длина кадра данных остается неизменным, поэтому он не фильтрует ничего.

3) Я добавил новый столбец, содержащий последовательно соединенные струнные/идентификаторы, а затем попытаться отфильтровать впоследствии (см Filter dataframe rows if value in column is in a set list of values):

df["ACIDS"] = df["AcNo"] + df["Sortcode"] 
df[df["ACIDS"].isin(acids)] 

Но опять же, dataframe не меняется.

Я надеюсь, что это имеет смысл ...

Любые предложения, где я мог бы быть неправильно? Спасибо, Anne

+1

Не могли бы вы опубликовать небольшой пример того, что ваш '' dataframe' и series' и то, что вы ожидаете, ваши результаты будут выглядеть? – TomAugspurger

+0

Эти операции не находятся на месте, поэтому рамка данных не просто изменится, если вы явно не сообщите об этом (это хорошая вещь **). –

+0

Привет, Энди, спасибо большое, если я добавлю 'df = ...' в третье решение, оно работает. – Anne

ответ

3

Я думаю, что вы просите что-то вроде следующего:

In [1]: other_ids = pd.Series(['a', 'b', 'c', 'c']) 

In [2]: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'c', 'f']}) 

In [3]: df 
Out[3]: 
    ids vals 
0 a  1 
1 b  2 
2 c  3 
3 f  4 

In [4]: other_ids 
Out[4]: 
0 a 
1 b 
2 c 
3 c 
dtype: object 

В этом случае ряд other_ids будет как ваш серии acids. Мы хотим выбрать только те строки из df, чьи id в серии other_ids. Для этого мы будем использовать метод dataframe.isin().

In [5]: df.ids.isin(other_ids) 
Out[5]: 
0  True 
1  True 
2  True 
3 False 
Name: ids, dtype: bool 

Это дает столбец BOOLS, что мы можем индекс в:

In [6]: df[df.ids.isin(other_ids)] 
Out[6]: 
    ids vals 
0 a  1 
1 b  2 
2 c  3 

Это близко к тому, что вы делаете с вашим 3 попытки. После публикации образца вашего фрейма данных я могу отредактировать этот ответ, если он не работает уже.

Чтение немного больше, у вас могут возникнуть проблемы, потому что у вас есть два столбца в df, которые являются вашими идентификаторами?Dataframe не имеет isin метод, но мы можем обойти это что-то вроде:

In [26]: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'f', 'f'], 
'ids2': ['e', 'f', 'c', 'f']}) 

In [27]: df 
Out[27]: 
    ids ids2 vals 
0 a e  1 
1 b f  2 
2 f c  3 
3 f f  4 

In [28]: df.ids.isin(ids) + df.ids2.isin(ids) 
Out[28]: 
0  True 
1  True 
2  True 
3 False 
dtype: bool 

True, как 1 и False подобен нулю, поэтому мы добавим два булево серию из двух isins(), чтобы получить что-то вроде Операция OR. Тогда, как и раньше, мы можем индекс в этой булевой серии:

In [29]: new = df.ix[df.ids.isin(ids) + df.ids2.isin(ids)] 

In [30]: new 
Out[30]: 
    ids ids2 vals 
0 a e  1 
1 b f  2 
2 f c  3 
+0

Я думаю, что основная путаница в этом вопросе состоит в том, что эти операции не находятся на месте (т. Е. Вам нужно установить 'df = df [df.ids.isin (other_ids)]') –

+0

Я думаю, что это правильно. Другая проблема * может заключаться в том, что у нее есть два столбца для 'ids', где у меня есть один. Есть ли причина, по которой 'dataframe' не имеет метода' isin() 'с некоторыми параметрами типа' или' и 'и'? – TomAugspurger

+0

Нет, это должно быть хорошо. Я думаю, что более эффективно делать или/или впоследствии, поэтому панды принимают исполнительное решение о том, что вы должны это сделать. –

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