Вычислите среднее значение по Groupby, удалите несколько строк с логическими условиями и сохраните файл в исходном формате - PullRequest
0 голосов
/ 04 июня 2018

У меня есть такие данные.

enter image description here

Я вычисляю среднее значение для каждого идентификатора

df.groupby(['ID'], as_index= False)['A'].mean()

Теперь яхочу отбросить все те идентификаторы, чье среднее значение больше 3

df.drop(df[df.A > 3].index)

И вот здесь я застрял.Я хочу сохранить файл, но в оригинальном формате (без группировки и без среднего значения) и без тех идентификаторов, чьи средства были больше 3. Любая идея Как мне этого добиться.Выведите что-то вроде этого.Также я хочу знать, сколько уникальных идентификаторов было удалено при использовании drop.

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Другое решение с использованием groupby и filter.Это решение медленнее, чем использование преобразования с логическим индексированием.

df.groupby('ID').filter(lambda x: x['A'].mean() < 3)

Вывод:

   ID  A
0   1  2
1   1  3
2   1  1
6   3  6
7   3  1
8   3  1
9   3  1
0 голосов
/ 04 июня 2018

Используйте transform для Series с тем же размером, что и оригинал DataFrame, поэтому возможна фильтрация по измененному условию с > 3 до <=3 по boolean indexing:

df1 = df[df.groupby('ID')['A'].transform('mean') <= 3]
print (df1)

   ID  A
0   1  2
1   1  3
2   1  1
6   3  6
7   3  1
8   3  1
9   3  1

Подробности :

print (df.groupby('ID')['A'].transform('mean'))

0    2.000000
1    2.000000
2    2.000000
3    6.666667
4    6.666667
5    6.666667
6    2.250000
7    2.250000
8    2.250000
9    2.250000
Name: A, dtype: float64

print (df.groupby('ID')['A'].transform('mean') <= 3)

0     True
1     True
2     True
3    False
4    False
5    False
6     True
7     True
8     True
9     True
Name: A, dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...