pandas
Дублированные данные
Поиск…
Выберите дублированный
Если нужно установить значение 0
в столбец B
, где в столбце A
дублируются данные, сначала создайте маску с помощью Series.duplicated
а затем используйте DataFrame.ix
или Series.mask
:
In [224]: df = pd.DataFrame({'A':[1,2,3,3,2],
...: 'B':[1,7,3,0,8]})
In [225]: mask = df.A.duplicated(keep=False)
In [226]: mask
Out[226]:
0 False
1 True
2 True
3 True
4 True
Name: A, dtype: bool
In [227]: df.ix[mask, 'B'] = 0
In [228]: df['C'] = df.A.mask(mask, 0)
In [229]: df
Out[229]:
A B C
0 1 1 1
1 2 0 0
2 3 0 0
3 3 0 0
4 2 0 0
Если нужно инвертировать маску, используйте ~
:
In [230]: df['C'] = df.A.mask(~mask, 0)
In [231]: df
Out[231]:
A B C
0 1 1 0
1 2 0 2
2 3 0 3
3 3 0 3
4 2 0 2
Двойное дублирование
Использовать drop_duplicates
:
In [216]: df = pd.DataFrame({'A':[1,2,3,3,2],
...: 'B':[1,7,3,0,8]})
In [217]: df
Out[217]:
A B
0 1 1
1 2 7
2 3 3
3 3 0
4 2 8
# keep only the last value
In [218]: df.drop_duplicates(subset=['A'], keep='last')
Out[218]:
A B
0 1 1
3 3 0
4 2 8
# keep only the first value, default value
In [219]: df.drop_duplicates(subset=['A'], keep='first')
Out[219]:
A B
0 1 1
1 2 7
2 3 3
# drop all duplicated values
In [220]: df.drop_duplicates(subset=['A'], keep=False)
Out[220]:
A B
0 1 1
Если вы не хотите получать копию фрейма данных, но для изменения существующего:
In [221]: df = pd.DataFrame({'A':[1,2,3,3,2],
...: 'B':[1,7,3,0,8]})
In [222]: df.drop_duplicates(subset=['A'], inplace=True)
In [223]: df
Out[223]:
A B
0 1 1
1 2 7
2 3 3
Подсчет и получение уникальных элементов
Количество уникальных элементов в серии:
In [1]: id_numbers = pd.Series([111, 112, 112, 114, 115, 118, 114, 118, 112])
In [2]: id_numbers.nunique()
Out[2]: 5
Получите уникальные элементы в серии:
In [3]: id_numbers.unique()
Out[3]: array([111, 112, 114, 115, 118], dtype=int64)
In [4]: df = pd.DataFrame({'Group': list('ABAABABAAB'),
'ID': [1, 1, 2, 3, 3, 2, 1, 2, 1, 3]})
In [5]: df
Out[5]:
Group ID
0 A 1
1 B 1
2 A 2
3 A 3
4 B 3
5 A 2
6 B 1
7 A 2
8 A 1
9 B 3
Количество уникальных элементов в каждой группе:
In [6]: df.groupby('Group')['ID'].nunique()
Out[6]:
Group
A 3
B 2
Name: ID, dtype: int64
Получите уникальные элементы в каждой группе:
In [7]: df.groupby('Group')['ID'].unique()
Out[7]:
Group
A [1, 2, 3]
B [1, 3]
Name: ID, dtype: object
Получите уникальные значения из столбца.
In [15]: df = pd.DataFrame({"A":[1,1,2,3,1,1],"B":[5,4,3,4,6,7]})
In [21]: df
Out[21]:
A B
0 1 5
1 1 4
2 2 3
3 3 4
4 1 6
5 1 7
Чтобы получить уникальные значения в столбцах A и B.
In [22]: df["A"].unique()
Out[22]: array([1, 2, 3])
In [23]: df["B"].unique()
Out[23]: array([5, 4, 3, 6, 7])
Чтобы получить уникальные значения в столбце A в виде списка (обратите внимание, что unique()
может использоваться двумя разными способами)
In [24]: pd.unique(df['A']).tolist()
Out[24]: [1, 2, 3]
Вот более сложный пример. Скажем, мы хотим найти уникальные значения из столбца «B», где «A» равно 1.
Во-первых, давайте представим дубликат, чтобы вы могли видеть, как он работает. Давайте заменим 6 в строке «4», столбец «B» на 4:
In [24]: df.loc['4', 'B'] = 4
Out[24]:
A B
0 1 5
1 1 4
2 2 3
3 3 4
4 1 4
5 1 7
Теперь выберите данные:
In [25]: pd.unique(df[df['A'] == 1 ]['B']).tolist()
Out[25]: [5, 4, 7]
Это можно разбить, если сначала подумать о внутреннем DataFrame:
df['A'] == 1
Это находит значения в столбце A, равные 1, и применяет к ним True или False. Затем мы можем использовать это для выбора значений из столбца «B» DataFrame (внешний выбор DataFrame)
Для сравнения, вот список, если мы не используем уникальный. Он извлекает каждое значение в столбце «B», где столбец «A» равен 1
In [26]: df[df['A'] == 1]['B'].tolist()
Out[26]: [5, 4, 4, 7]