Проверьте, имеет ли группа данных Pandas Dataframe 2 определенных значения в столбце, и верните эти строки - PullRequest
0 голосов
/ 25 октября 2018

У меня есть групповой объект.Для каждой из этих групп мне нужно проверить, есть ли в конкретном столбце строки, содержащие значения -A и value-B, и вернуть только те 2 строки в группе.Если я использую isin или "|"Я бы получил случаи, когда любое из этих значений присутствует.Прямо сейчас я делаю неаккуратную работу по проверке первого условия, а затем проверяю второе условие, если первое верно, и объединяю результаты обеих проверок.

Мой код выглядит следующим образом:

import pandas as pd
from datetime import datetime, timedelta
from statistics import mean

dict = {'col-a': ['T1A', 'T1A', 'T1A', 'T1B', 'T1B', 'T1C', 'T1C', 'P1', 'P1'],
        'col-b': ['07:57:00', '09:00:00', '12:00:00', '08:00:00', '08:25:00', '08:15:00', '07:25:00', '10:00:00',  '07:45:00'],
        'col-c': ['11111', '22222', '99999', '33333', '22222', '22222', '99999', '22222', '99999'],
        'col-d': ['07:58:00', '09:01:00', '12:01:00', '08:01:00', '08:26:00', '08:16:00', '07:26:00', '10:01:00',  '07:46:00'],
        }

original_df = pd.DataFrame(dict)
print("original df\n", original_df)

# condition 1: must contain T1 in col-a
# condition 2: must contain 22222(variable) amongst each group of col-a
# condition 3: record containing 22222 should have col-b value between 7 and 9
# condition 4: must contain 99999(stays the same) among amongst each group of col-a where above conditions are met


no_to_check = '22222' # comes from another dataframe column

# filtering rows where col-a contains T1
filtered_df = original_df[original_df['col-a'].str.contains('T1')]

# grouping by col-a
trip_groups = filtered_df.groupby('col-a')

# checking if it contains '22222' in column c and '22222' has time between 7 and 9 in column b
trips_time_dict = {}
for group_key, group in trip_groups:
    check1 = group[(group['col-c'] == no_to_check) & (group['col-b'].between('07:00:00', '09:00:00'))]

    if len(check1) != 0:
        # checking if the group contains '99999' in column c
        check2 = group[group['col-c'] == '99999']

        if len(check2) != 0:
            all_conditions = pd.concat([check1,check2])

Требуемый вывод должен содержать одну строку для 22222 и одну строку для 99999 для каждой группы, которая удовлетворяет критериям.

1 Ответ

0 голосов
/ 25 октября 2018

IIUC, вы можете сделать следующее с df в качестве исходного кадра данных:

df[df['col-a'].str.contains('T1')].groupby('col-a').apply(lambda x: x[(x['col-c']=='22222') & (x['col-b'].between('07:00:00', '09:00:00')) & (x['col-c']=='99999').any()])

Выход:

        col-a     col-b  col-c     col-d
col-a                                   
T1A   1   T1A  09:00:00  22222  09:01:00
T1C   5   T1C  08:15:00  22222  08:16:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...