Как "выбрать отдельный" для нескольких столбцов фрейма данных в pandas?
Я ищу способ сделать эквивалент sql
"SELECT DISTINCT col1, col2 FROM dataframe_table"
Сравнение pandas sql не имеет ничего о "отличном"
.unique() работает только для одного столбца, поэтому, я полагаю, я мог бы конкатрировать столбцы или поместить их в список/кортеж и сравнить этот путь, но это похоже на то, что pandas должен делать в более родном путь.
Я пропустил что-то очевидное или нет способа сделать это?
Ответы
Ответ 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'])
Ответ 4
Я думаю, что использование drop duplicate
иногда не очень полезно в зависимости от данных.
Я нашел это:
[in] df['col_1'].unique()
[out] array(['A', 'B', 'C'], dtype=object)
И работа для меня!
https://riptutorial.com/pandas/example/26077/select-distinct-rows-across-dataframe
Ответ 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
как показано).