Как «выделить отдельные» в нескольких столбцах фрейма данных в пандах?

104

Я ищу способ сделать эквивалент SQL

SELECT DISTINCT col1, col2 FROM dataframe_table

Сравнение pandas sql ни о чем не говорит distinct.

.unique() работает только для одного столбца, поэтому я полагаю, что могу объединить столбцы или поместить их в список / кортеж и сравнить таким образом, но похоже, что панды должны делать более естественным образом.

Я упускаю что-то очевидное или нет способа сделать это?

Джоди
источник
Вам нужно будет сделать что-то подобное, df.apply(pd.Series.unique)но это не сработает, если количество уникальных значений варьируется в зависимости от столбца, поэтому вам придется создать dict из имен столбцов в качестве ключей и уникальных значений в качестве значений
EdChum

Ответы:

175

Вы можете использовать этот drop_duplicatesметод для получения уникальных строк в DataFrame:

In [29]: df = pd.DataFrame({'a':[1,2,1,2], 'b':[3,4,3,5]})

In [30]: df
Out[30]:
   a  b
0  1  3
1  2  4
2  1  3
3  2  5

In [32]: df.drop_duplicates()
Out[32]:
   a  b
0  1  3
1  2  4
3  2  5

Вы также можете subsetуказать аргумент ключевого слова, если хотите использовать только определенные столбцы для определения уникальности. См. Строку документации .

Джорис
источник
5
Возможно, стоит отметить, что df.drop_duplicates()по умолчанию это не метод на месте, поэтому он возвращает новый DataFrame (оставляя dfбез изменений). Это довольно стандартное поведение, но оно может быть полезным.
evophage
14

Я пробовал разные решения. Сначала было:

a_df=np.unique(df[['col1','col2']], axis=0)

и он хорошо работает для не объектных данных Другой способ сделать это и избежать ошибки (для типа столбцов объекта) - применить drop_duplicates ()

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]

Вы также можете использовать SQL для этого, но в моем случае он работал очень медленно:

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)
Юрий Кошелек
источник
7

Не существует uniqueметода для df, если бы количество уникальных значений для каждого столбца было одинаковым, то работало бы следующее: df.apply(pd.Series.unique)но если нет, то вы получите сообщение об ошибке. Другой подход - сохранить значения в dict, который вводится в имя столбца:

In [111]:
df = pd.DataFrame({'a':[0,1,2,2,4], 'b':[1,1,1,2,2]})
d={}
for col in df:
    d[col] = df[col].unique()
d

Out[111]:
{'a': array([0, 1, 2, 4], dtype=int64), 'b': array([1, 2], dtype=int64)}
EdChum
источник
можно ли проверить уникальность для нескольких столбцов?
Anoop D
Получил ответ от другого SO-вопроса, используя numpynp.unique(df[['column1','column2']].values)
Anoop D
6

Для решения подобной проблемы я использую groupby:

print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")

Однако будет ли это уместным, будет зависеть от того, что вы хотите сделать с результатом (в моем случае мне просто нужен был эквивалент, COUNT DISTINCTкак показано).

Ncoghlan
источник
-1

Вы можете взять наборы столбцов и просто вычесть меньший набор из большего набора:

distinct_values = set(df['a'])-set(df['b'])
Dorante
источник