#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я пытаюсь определить и отметить повторяющиеся значения «образца» в фрейме данных, используя groupby с помощью lambda:
rdtRows["DuplicateSample"] = False
rdtRowsSampleGrouped = rdtRows.groupby( ['Sample']).filter(lambda x: len(x) > 1)
rdtRowsSampleGrouped["DuplicateSample"] = True
# How to get flag changes made on rdtRowsSampleGrouped to apply to rdtRows??
Как мне внести изменения / применить «DuplicateSample» к исходным данным RDTROW? Я в тупике
: (
Ответ №1:
Используйте GroupBy.transform
с GroupBy.size
:
df['DuplicateSample'] = df.groupby('Sample')['Sample'].transform('size') > 1
Или используйте Series.duplicated
с keep=False
, если требуется более быстрое решение:
df['DuplicateSample'] = df['Sample'].duplicated(keep=False)
Производительность в некоторых образцах данных (в реальном времени должна быть разной, зависит от количества строк, количества дублированных значений):
np.random.seed(2020)
N = 100000
df = pd.DataFrame({'Sample': np.random.randint(100000, size=N)})
In [51]: %timeit df['DuplicateSample'] = df.groupby('Sample')['Sample'].transform('size') > 1
17 ms ± 50 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [52]: %timeit df['DuplicateSample1'] = df['Sample'].duplicated(keep=False)
3.73 ms ± 40 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
#Stef solution is unfortunately 2734times slowier like duplicated solution
In [53]: %timeit df['DuplicateSample2'] = df.groupby('Sample')['Sample'].transform(lambda x: len(x)>1)
10.2 s ± 517 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Комментарии:
1. Очень полезно, большое спасибо. Преобразование — это область, о которой я мало что знаю, и теперь буду исследовать дальше. Приятно видеть альтернативные способы достижения результата и очень хорошо видеть информацию о времени.
Ответ №2:
Вы можете использовать transform
:
import pandas as pd
df = pd.DataFrame({'Sample': [1,2,2,3,4,4]})
df['DuplicateSample'] = df.groupby('Sample')['Sample'].transform(lambda x: len(x)>1)
Результат:
Sample DuplicateSample
0 1 False
1 2 True
2 2 True
3 3 False
4 4 True
5 4 True
Комментарии:
1. Очень полезно, большое спасибо. Преобразование — это область, о которой я мало что знаю, и теперь буду исследовать дальше. Очень полезно также увидеть пример вывода в виде простой для понимания небольшой таблицы. Я чувствую, что это чрезвычайно полезно.