Отфильтруйте pandas df: для каждой группы сохраняйте только ненулевые строки, если они у нас есть, иначе оставьте одну нPython

Программы на Python
Ответить
Anonymous
 Отфильтруйте pandas df: для каждой группы сохраняйте только ненулевые строки, если они у нас есть, иначе оставьте одну н

Сообщение Anonymous »

Надеюсь, название достаточно интуитивно понятное, правки приветствуются. Скажем, у меня есть этот фрейм данных:

Код: Выделить всё

df = pd.DataFrame({'x': ['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D'],
'y': [None, None, 1, 2, 3, 4, None, None]})

x   y
0   A   NaN
1   B   NaN
2   B   1.0
3   C   2.0
4   C   3.0
5   C   4.0
6   D   NaN
7   D   NaN
Для каждой группирующей переменной x в этом случае я хочу сохранить:
  • только строки, где y не имеет значения None, если существуют какие-либо ненулевые значения
  • одну строку для представления x в случае, если все y равны None
То есть: сохранить A (только одно нулевое значение) row), только ненулевое значение B, все значения C и одна строка для D
Вот один из подходов:

Код: Выделить всё

pd.concat([
df.groupby('x').filter(lambda x: any(x['y'].notna())).dropna(),
df.groupby('x').filter(lambda x: all(x['y'].isna())).drop_duplicates()
])

x   y
2   B   1.0
3   C   2.0
4   C   3.0
5   C   4.0
0   A   NaN
6   D   NaN
Я также мог бы удалить NA и объединить их с уникальными значениями x, чтобы вернуть те, которые больше не представлены?

Код: Выделить всё

df.loc[df['y'].notna()].merge(df[['x']].drop_duplicates(),
on='x', how='outer')

x   y
0   A   NaN
1   B   1.0
2   C   2.0
3   C   3.0
4   C   4.0
5   D   NaN
Есть ли что-нибудь более элегантное, чем это? Я думал о каком-то универсальном фильтре(), но отказался...

Подробнее здесь: https://stackoverflow.com/questions/798 ... m-else-kee
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»