Как применить изменения к фрейму данных подмножества к исходному фрейму данных

#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. Очень полезно, большое спасибо. Преобразование — это область, о которой я мало что знаю, и теперь буду исследовать дальше. Очень полезно также увидеть пример вывода в виде простой для понимания небольшой таблицы. Я чувствую, что это чрезвычайно полезно.