Подтвердить что ты не робот

Как "выбрать отдельный" для нескольких столбцов фрейма данных в pandas?

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

"SELECT DISTINCT col1, col2 FROM dataframe_table"

Сравнение pandas sql не имеет ничего о "отличном"

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

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

4b9b3361

Ответ 1

Вы можете использовать метод 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, если вы хотите использовать определенные столбцы для определения уникальности. См. docstring.

Ответ 2

Нет метода 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)}

Ответ 3

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

distinct_values = set(df['a'])-set(df['b'])

Ответ 5

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

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)

Ответ 6

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

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

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