如何 "select distinct" 跨越 pandas 中的多个数据框列?
How to "select distinct" across multiple data frame columns in pandas?
我正在寻找一种与 SQL
等效的方法
SELECT DISTINCT col1, col2 FROM dataframe_table
pandas sql 比较没有关于 distinct
的任何内容。
.unique()
仅适用于单个列,所以我想我可以连接这些列,或者将它们放在 list/tuple 中并以这种方式进行比较,但这看起来像是 pandas 应该以更原生的方式进行。
我是不是遗漏了一些明显的东西,或者没有办法做到这一点?
df 没有 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 中的唯一行:
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_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)
为了解决类似的问题,我使用 groupby
:
print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")
这是否合适取决于你想对结果做什么(在我的例子中,我只想要 COUNT DISTINCT
的等价物,如图所示)。
我正在寻找一种与 SQL
等效的方法SELECT DISTINCT col1, col2 FROM dataframe_table
pandas sql 比较没有关于 distinct
的任何内容。
.unique()
仅适用于单个列,所以我想我可以连接这些列,或者将它们放在 list/tuple 中并以这种方式进行比较,但这看起来像是 pandas 应该以更原生的方式进行。
我是不是遗漏了一些明显的东西,或者没有办法做到这一点?
df 没有 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 中的唯一行:
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_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)
为了解决类似的问题,我使用 groupby
:
print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")
这是否合适取决于你想对结果做什么(在我的例子中,我只想要 COUNT DISTINCT
的等价物,如图所示)。