我正在寻找一种与sql相同的方法
" SELECT DISTINCT col1,col2 FROM dataframe_table"
pandas sql比较没有关于" distinct"
的任何内容.unique()仅适用于单个列,所以我想我可以连接列,或者将它们放在列表/元组中并进行比较,但这似乎是大熊猫应该以更原生的方式做的事情。
我错过了一些明显的东西,或者没有办法做到这一点?
答案 0 :(得分:110)
您可以使用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。
答案 1 :(得分:6)
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)}
答案 2 :(得分:2)
我尝试了不同的解决方案。首先是:
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)
答案 3 :(得分:2)
要解决类似的问题,我正在使用groupby
:
print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")
这是否合适取决于您想要对结果做些什么(在我的情况下,我只想要与所示的COUNT DISTINCT
等效)。
答案 4 :(得分:1)
我认为根据数据帧,有时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 :(得分:0)
您可以获取列的集合,只需从较大的集合中减去较小的集合:
distinct_values = set(df['a'])-set(df['b'])