Панды - фильтр по группам, в которых есть хотя бы один столбец, содержащий ненулевые значения в группе - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующий фрейм данных Python Pandas:

df = pd.DataFrame({'Id': ['1', '1', '1', '2', '2', '3'], 'A': ['TRUE', 'TRUE', 'TRUE', 'TRUE', 'TRUE', 'FALSE'], 'B': [np.nan, np.nan, 'abc', np.nan, np.nan, 'def'],'C': [np.nan, np.nan, np.nan, np.nan, np.nan, '456']})

>>> print(df)
  Id      A    B    C
0  1   TRUE  NaN  NaN
1  1   TRUE  NaN  NaN
2  1   TRUE  abc  NaN
3  2   TRUE  NaN  NaN
4  2   TRUE  NaN  NaN
5  3  FALSE  def  456

Я хочу получить следующий фрейм данных:

>>> print(dfout)
  Id     A    B   C
0  1  TRUE  abc NaN

Одно и то же значение Id может появляться в нескольких строках.Каждый идентификатор будет иметь значение ИСТИНА или ЛОЖЬ в столбце А последовательно во всех его строках.Столбцы B и C могут иметь любое значение, включая NaN.
Мне нужна одна строка в dfout для каждого идентификатора, имеющего A = TRUE, и показано максимальное значение, видимое в столбцах B и C. Но если только значения, видимые в столбцах Bи C = NaN для всех строк Id, тогда этот Id должен быть исключен из dfout.

  • Идентификатор 1 имеет A=TRUE, а в третьем ряду B=abc, поэтому он соответствует требованиям.
  • Id 2 имеет A=TRUE, но столбцы B и C равны NaN для обеих своих строк, поэтому он не имеет.
  • Id 3 имеет A=FALSE, поэтому он не соответствуеттребования.

Я создал groupby df на Id, затем применил маску, чтобы включить только строки с A = TRUE.Но у меня возникли проблемы с пониманием того, как удалить строки с NaN для всех строк в столбцах B и C.

grouped = df.groupby(['Id'])
mask = grouped['A'].transform(lambda x: 'TRUE' == x.max()).astype(bool)
df.loc[mask].reset_index(drop=True)

  Id     A    B    C
0  1  TRUE  NaN  NaN
1  1  TRUE  NaN  NaN
2  1  TRUE  abc  NaN
3  2  TRUE  NaN  NaN
4  2  TRUE  NaN  NaN

Затем я попробовал несколько вещей в следующем виде:

df.loc[mask].reset_index(drop=True).all(['B'],['C']).isnull

Но получаю ошибки, такие как:

"Ошибка типа: неустранимый тип: 'список'".

Использование python 3.6, pandas 0.23.0;Поищите здесь справку: сохранить строки данных, соответствующие условию, в каждой группе одного и того же кадра данных, сгруппированной по

1 Ответ

0 голосов
/ 22 ноября 2018

Решение состоит из трех частей.

  1. Отфильтруйте фрейм данных, чтобы сохранить строки, в которых столбец A равен True
  2. Идентификатор группы и используйте первый, который вернет первое, а не нулевое значение
  3. Использовать дропну нарезультирующий кадр данных для столбцов B и C и how = all

    df.loc [df ['A'] == True] .groupby ('Id', as_index = False) .first (). dropna (subset)= ['B', 'C'], how = 'all')

        Id  A       B   C
    0   1   True    abc NaN
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...