我正在寻找一种与 SQL 等效的方法
SELECT DISTINCT col1, col2 FROM dataframe_table
熊猫的 sql 比较没有任何关于 distinct的内容。
distinct
.unique()只适用于一个列,所以我认为我可以连接这些列,或者将它们放在一个列表/元组中,然后以这种方式进行比较,但是这似乎是大熊猫应该以一种更本地化的方式来做的事情。
.unique()
我是漏掉了什么明显的东西,还是没有办法做到这一点?
没有用于 df 的 unique方法,如果每列的唯一值的数目相同,那么以下方法可以工作: df.apply(pd.Series.unique),但是如果不是,那么您将得到一个错误。另一种方法是将值存储在一个用键控制列名的 dict 中:
unique
df.apply(pd.Series.unique)
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)}
可以使用 drop_duplicates方法获取 DataFrame 中的唯一行:
drop_duplicates
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。
subset
你可以把列的集合从大的集合中减去小的集合:
distinct_values = set(df['a'])-set(df['b'])
我认为使用 drop duplicate有时不会那么有用,取决于数据帧。
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
我尝试过不同的解决方案,第一个是:
a_df=np.unique(df[['col1','col2']], axis=0)
而且对于非对象数据也能很好地工作 实现这一点并避免错误(对于对象列类型)的另一种方法是应用 drop _ double ()
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)
为了解决类似的问题,我使用 groupby:
groupby
print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")
不过,这是否合适将取决于您想对结果做什么(在我的例子中,我只想要如图所示的 COUNT DISTINCT的等价物)。
COUNT DISTINCT