Создавайте фильтры внутри групповых панд - PullRequest
0 голосов
/ 17 января 2019

У меня следующий результат:

[4 rows x 10 columns]
          id  ID_ENTIDADE                       ENTIDADE     CHAMADO     ...                 DATA_ALT VALOR_OLD           VALOR_NEW  PRIORIDADE
695  6802505          136 Professional Services > Ser...  2019000518     ...      2019-01-14 15:21:01       NaN             N1 (20)           0
698  6804412          136 Professional Services > Ser...  2019000518     ...      2019-01-14 15:52:46       NaN  Contrato 157 (198)           0
699  6804413          136 Professional Services > Ser...  2019000518     ...      2019-01-14 15:52:46       1.0                   2          14
700  6804415          136 Professional Services > Ser...  2019000518     ...      2019-01-14 15:52:46       3.0                   1           3
701  6804650          136 Professional Services > Ser...  2019000518     ...      2019-01-14 15:53:32       NaN  N1 - Security (25)           0

[5 rows x 10 columns]
          id  ID_ENTIDADE                       ENTIDADE     CHAMADO     ...                 DATA_ALT VALOR_OLD           VALOR_NEW  PRIORIDADE
705  6805135          136 Professional Services > Ser...  2019000519     ...      2019-01-14 16:02:01       NaN             N1 (20)           0
711  6806934          136 Professional Services > Ser...  2019000519     ...      2019-01-14 16:33:41       NaN  N1 - Security (25)           0
712  6806936          136 Professional Services > Ser...  2019000519     ...      2019-01-14 16:33:41       1.0                   2          14
713  6806938          136 Professional Services > Ser...  2019000519     ...      2019-01-14 16:33:41       3.0                   1           3
710  6806932          136 Professional Services > Ser...  2019000519     ...      2019-01-14 16:33:41       NaN  Contrato 157 (198)           0

[5 rows x 10 columns]
          id  ID_ENTIDADE                       ENTIDADE     CHAMADO     ...                 DATA_ALT VALOR_OLD           VALOR_NEW  PRIORIDADE
717  6808869          105 Professional Services > Sup...  2019000523     ...      2019-01-14 17:05:35       NaN  Contrato 135 (136)           0
718  6808870          105 Professional Services > Sup...  2019000523     ...      2019-01-14 17:05:35       NaN        N2 - DC (28)           0
757  6810787          105 Professional Services > Sup...  2019000523     ...      2019-01-14 17:41:31       3.0                   2           3

[3 rows x 10 columns]
          id  ID_ENTIDADE                       ENTIDADE     CHAMADO     ...                 DATA_ALT VALOR_OLD           VALOR_NEW  PRIORIDADE
719  6808990          136 Professional Services > Ser...  2019000524     ...      2019-01-14 17:10:02       NaN             N1 (20)           0
720  6809088          136 Professional Services > Ser...  2019000524     ...      2019-01-14 17:12:59       NaN  Contrato 157 (198)           0
721  6809090          136 Professional Services > Ser...  2019000524     ...      2019-01-14 17:12:59       NaN  N1 - Security (25)           0
722  6809092          136 Professional Services > Ser...  2019000524     ...      2019-01-14 17:12:59       1.0                   2          14
723  6809094          136 Professional Services > Ser...  2019000524     ...      2019-01-14 17:12:59       3.0                   1           3

[5 rows x 10 columns]

Который я получил со следующим кодом:

df = pd.read_csv("csv3.csv", sep=";", encoding = "ISO-8859-1")
df2 = df.sort_values(['CHAMADO', 'id'])


g1 = df2.sort_values(['DATA_ALT'], ascending=True)


ret_group = g1.groupby(['CHAMADO'])

for key, group in ret_group:
    if  group['PRIORIDADE'].any() == True:

        print(group)

Но мне нужен фильтр, который проверяет первые 3 строки столбца "VALOR_NEW", если в нем есть слово "CONTRATO".

Я не могу создать фильтр, который может это делать, каждый фильтр, который я делаю, он возвращает мне результаты только тогда, когда слово «CONTRATO» появляется в первой строке, как в примере ниже:

          id  ID_ENTIDADE                       ENTIDADE     CHAMADO     ...                 DATA_ALT VALOR_OLD           VALOR_NEW  PRIORIDADE
717  6808869          105 Professional Services > Sup...  2019000523     ...      2019-01-14 17:05:35       NaN  Contrato 135 (136)           0
718  6808870          105 Professional Services > Sup...  2019000523     ...      2019-01-14 17:05:35       NaN        N2 - DC (28)           0
757  6810787          105 Professional Services > Sup...  2019000523     ...      2019-01-14 17:41:31       3.0                   2           3

[3 rows x 10 columns]

Ответы [ 3 ]

0 голосов
/ 17 января 2019

IIUC, вам нужно проверить свои сгруппированные кадры данных на 'Contrato' в столбце 'VALOR_NEW' в первых трех строках. Эта проверка должна сделать это:

if (group['VALOR_NEW'].head(3) == 'Contrato').any():
    print(group)
0 голосов
/ 17 января 2019

Вы можете использовать что-то вроде этого:

my_list = list(df.groupby('CHAMADO').apply(lambda x: x[:3][x[:3]['VALOR_NEW'].str.contains('Contrato',na=False)])['CHAMADO'].values)
#[2019000518, 2019000523, 2019000524]

Это дает список группы, которая содержит слово Contrato в первых 3 строках.

>>df[df.CHAMADO.isin(my_list)]

Это даст вам весь фрейм данных, содержащий эти значения в CHAMADO с Contrato в первых 3 строках.

Для хранения значений в отдельных фреймах данных вы можете создать словарь:

dfs = ['df_' + str(x) for x in my_list]
dicdf = dict()
i = 0 
while i < len(dfs):
    dicdf[dfs[i]] = df[(df['CHAMADO']== my_list[i])]
    i = i + 1
print(dicdf)

Вы можете хранить любые другие методы, которые вам нравятся или которые вы видите в SO.

0 голосов
/ 17 января 2019

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

сначала те, которые содержат CONTRATO:

df1 = group.loc[group['VALOR_NEW'].fillna('nada').str.contains('CONTRATO')].head(3)

Затем еще один, который не (обратите внимание на «~» в начале .loc, это означает противоположное:

df2 = group.loc[~group['VALOR_NEW'].fillna('nada').str.contains('CONTRATO')]

Наконец, вы согласны с обоими с CONTRATO:

df3 = pd.concat([df1,df2])

Обратите внимание, что он чувствителен к регистру, и я добавил fillna(), потому что вы не можете искать, если он имеет значения nan.

Редактировать: добавили .head(3) в конце, чтобы получить только первые 3 строки, как вы и просили.

edit2: отредактировано оригинальное решение

vlwflws

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