Python - Фильтр DataFrame через сравнение столбцов с другим df / list - PullRequest
0 голосов
/ 29 июня 2018

Итак, у меня есть словарь DataFrames, который я сейчас разделил на отдельные DataFrames, потому что я не знаю, как работать с ним прямо в словаре. Это результаты испытаний, которые выглядят так, например,

T01
mm    N    Cycle
a     1      1
b     2      1
c     3      2
d     4      2
e     5      3
...   ...    ...

Теперь я создал еще один DataFrame (также попробовал его со списком), выглядящий так:

Cycles
1
3
5
...

Моя цель - отфильтровать все строки, где

Cycle != Cycles

Итак, я получаю список, который выглядит так:

mm    N    Cycle
a     1      1
b     2      1
e     5      3
f     6      3
...   ...    ...

Я создал DataFrames с помощью этого кода:

for k,v in data_dict.items():    
    globals()[k] = (v[['mm','N', 'Unnamed: 3']])
    globals()[k].columns = ['mm', 'N', 'Cycles']

Теперь у меня есть 7 различных фреймов данных с разными размерами в диапазоне от (2570, 3) до (12402, 3).

Я все время оглядывался, но не могу найти способ, который бы сработал. Может быть, мне не следовало использовать вызов globals () [k]? Я довольно плохо знаком с Python, поэтому мне не хватает знаний. Заранее спасибо

Edit: я пробовал это с операциями bool, как

 globals()[k].query("Cycle" != Cycles['Cycles'])

или

 globals()[k][globals()[k].Cycle != Cycles['Cycles']]

Но это ничего не делает для меня.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Итак, у вас есть диктат DataFrames, назовем его data_dict и список циклов Cycles.
Вы говорите, что не знаете, как обращаться со словарем информационных фреймов, но на самом деле это самая простая часть, если вы знаете, как обрабатывать один фрейм данных, поскольку вам просто нужно перебрать его. Чтобы решить вашу проблему, просто используйте метод isin:

res = {}
for id, df in data_dict.items():
    #loop over the dataframes in the dict
    res[id] = df[df.Cycle.isin(Cycles)]
    #this is a new dataframe where you have only the cycles in Cycles
0 голосов
/ 29 июня 2018

Как то так?

Скажем, ваши фреймы данных определены как:

test = pd.DataFrame ({'mm': ['1', 'b', 'c', 'd', 'e'], 'N': [1,2,3,4,5 ], 'Цикл': [1,1,2,2,3]})

test2 = pd.DataFrame ({'Cycles': [1,3,5]})

Чтобы отфильтровать столбцы:

test3 = test [test.Cycle.isin (test2.Cycles)]

Out [19]: Цикл N мм 0 1 1 1 1 1 2 б 4 3 5 e

0 голосов
/ 29 июня 2018

Предположим, у вас есть список циклов, по которым вы хотите выполнить фильтрацию:

cycle_list = [1, 2, 3]

Теперь, имея словарь фреймов данных data_dict, вы можете использовать словарное понимание с логическими масками для фильтрации строк, удовлетворяющих вашему условию:

res = {k: v[v['Cycles'].isin(cycle_list)] for k, v in data_dict.items()}

Предполагается, что каждый из ваших фреймов данных имеет серию Cycles. pd.Series.isin возвращает серию логических значений, которые используются для индексации вашего кадра данных.

Кроме того, обратите внимание, что причины использования globals() очень редки; по возможности избегайте звонков на globals.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...