проверить правильность для столбца флага в нескольких рядах pandas

У меня есть dataframe:

a id flag1 flag2 abc 1 1 0 123 1 0 1 xyz 2 1 0 111 2 0 1 qwe 3 1 0 qwe 3 1 0 mmm 4 1 0 222 4 0 1 

Я хочу найти номер id где оба флага1 и флаг2 равны 1 .

например. для id 1, в первой строке, флаг1 = 1 и флаг2 = 0, а вторая строка – флаг1 = 0 и флаг2 = 1.

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

 a id flag1 flag2 abc 1 1 0 123 1 0 1 xyz 2 1 0 111 2 0 1 mmm 4 1 0 222 4 0 1 

или только столбец с идентификатором также будет работать [1,2,4] в списке

поскольку для id = 3 флаг 1 был равен 1 в обеих строках с id = 3, а флаг 2 равен 0, поэтому я должен пренебрегать им.

Я пытался написать func, но не смог.

 def checkValidTransactionRow(frame): df['id'][(df['flag1']==1) & (df['flag2']==1) ].unique() 

2 Solutions collect form web for “проверить правильность для столбца флага в нескольких рядах pandas”

Попробуйте этот подход:

 In [23]: ids = df.groupby('id')['flag1','flag2'].apply(lambda x: x.eq(1).any()).all(1) In [24]: ids Out[24]: id 1 True 2 True 3 False 4 True dtype: bool In [25]: ids.index[ids] Out[25]: Int64Index([1, 2, 4], dtype='int64', name='id') 

Объяснение:

 In [26]: df.groupby('id')['flag1','flag2'].apply(lambda x: x.eq(1).any()) Out[26]: flag1 flag2 id 1 True True 2 True True 3 True False 4 True True 

x.eq(1).any() совпадает с (x == 1).any() – т.е. возвращает True если хотя бы одно значение из x рядов равно 1 , в противном случае возвращает False

ОБНОВИТЬ:

 In [34]: ids.index[ids].values Out[34]: array([1, 2, 4], dtype=int64) In [35]: ids.index[ids].values.tolist() Out[35]: [1, 2, 4] 

Я уверен, что есть лучший способ добиться этого, но вы можете попробовать:

 df['count_max1'] = df.groupby(['id'])['flag1'].transform(max) df['count_max2'] = df.groupby(['id'])['flag2'].transform(max) # Select rows df[(df['count_max1'] ==1 & (df['count_max2'] == 1)] 

Что делает матрица преобразования:

 a id flag1 flag2 count_max1 count_max2 abc 1 1 0 1 1 123 1 0 1 1 1 xyz 2 1 0 1 1 111 2 0 1 1 1 qwe 3 1 0 1 0 qwe 3 1 0 1 0 mmm 4 1 0 1 1 222 4 0 1 1 1 

Когда вы выбираете строки, конечный вывод будет:

 a id flag1 flag2 count_max1 count_max2 abc 1 1 0 1 1 123 1 0 1 1 1 xyz 2 1 0 1 1 111 2 0 1 1 1 mmm 4 1 0 1 1 222 4 0 1 1 1 

вы можете сбросить строки count_max1 и count_max2 позже

  • Построить pandas DataFrame из списка кортежей
  • График igraph из матрицы смежности numpy или pandas
  • datetime dtypes в pandas read_csv
  • Сопоставление значений столбцов в Pandas DataFrame со значениями «NaN»
  • возврат агрегированного кадра данных из группы pandas groupby
  • Ошибка данных запаса python pandas yahoo
  • Применить функцию ко второму столбцу в pandas dataframe groupby
  • который является наиболее эффективным способом загрузки набора данных JSON в Pandas DataFrames
  • Python - лучший язык программирования в мире.