Як "вибрати відмінність" у кількох стовпцях фреймів даних у пандах?


101

Я шукаю спосіб зробити еквівалент SQL

SELECT DISTINCT col1, col2 FROM dataframe_table

Порівняння pandas sql не має нічого distinct.

.unique() працює лише для одного стовпця, тож я гадаю, що я міг би конкретизувати стовпці, або помістити їх у список / кортеж і порівняти це, але це здається, що щось має робити панди більш рідним способом.

Я пропускаю щось очевидне, чи немає способу це зробити?


Вам доведеться зробити щось на кшталт df.apply(pd.Series.unique)цього, але це не спрацює, якщо кількість унікальних значень змінюється в стовпцях, тож вам доведеться побудувати дикт із імен стовпців як ключових, а унікальних - як значень
EdChum

Відповіді:


172

Ви можете використовувати 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аргумент ключового слова, якщо ви хочете використовувати певні стовпці для визначення унікальності. Дивіться докстринг .


3
Можливо, варто зауважити, що df.drop_duplicates()за замовчуванням це не місце заміщення, тому повертає новий DataFrame (залишаючи dfбез змін). Це досить стандартна поведінка, але все ж може бути корисною.
евофаг

13

Я пробував різні рішення. Спочатку було:

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)}

чи можна перевірити унікальність для кількох стовпців?
Anoop D

Отримав відповідь на інше запитання про те, використовуючи numpynp.unique(df[['column1','column2']].values)
Anoop D

6

Для вирішення подібної проблеми я використовую groupby:

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

Наскільки це підходить, буде залежати від того, що ви хочете зробити з результатом (в моєму випадку я просто хотів еквівалент, COUNT DISTINCTяк показано).



-1

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

distinct_values = set(df['a'])-set(df['b'])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.