У меня есть следующий фрейм данных 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;Поищите здесь справку: сохранить строки данных, соответствующие условию, в каждой группе одного и того же кадра данных, сгруппированной по