如何在大熊猫的多个数据框架列之间“选择不同的”?

我正在寻找一种与 SQL 等效的方法

SELECT DISTINCT col1, col2 FROM dataframe_table

熊猫的 sql 比较没有任何关于 distinct的内容。

.unique()只适用于一个列,所以我认为我可以连接这些列,或者将它们放在一个列表/元组中,然后以这种方式进行比较,但是这似乎是大熊猫应该以一种更本地化的方式来做的事情。

我是漏掉了什么明显的东西,还是没有办法做到这一点?

327718 次浏览

没有用于 df 的 unique方法,如果每列的唯一值的数目相同,那么以下方法可以工作: 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)}

可以使用 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

你可以把列的集合从大的集合中减去小的集合:

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

我认为使用 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:

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

不过,这是否合适将取决于您想对结果做什么(在我的例子中,我只想要如图所示的 COUNT DISTINCT的等价物)。