如何在pandas中的多个数据框列中"选择不同"?

Jod*_*ody 74 python pandas

我正在寻找一种方法来做相当于sql的方法

"SELECT DISTINCT col1,col2 FROM dataframe_table"

pandas sql比较没有关于"distinct"的任何内容

.unique()仅适用于单个列,所以我想我可以将列连接起来,或者将它们放在列表/元组中并进行比较,但这似乎是大熊猫应该以更原生的方式进行的.

我错过了一些明显的东西,还是没有办法做到这一点?

jor*_*ris 135

您可以使用该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
Run Code Online (Sandbox Code Playgroud)

subset如果您只想使用某些列来确定唯一性,也可以提供关键字参数.请参阅docstring.

  • 可能值得注意的是,默认情况下 `df.drop_duplicates()` 不是一个就地方法,因此返回一个新的 DataFrame(保持 `df` 不变)。这是相当标准的行为,但可能仍然有用指出。 (12认同)

Yur*_*let 22

我尝试了不同的解决方案。首先是:

a_df=np.unique(df[['col1','col2']], axis=0)
Run Code Online (Sandbox Code Playgroud)

它适用于非对象数据 另一种方法来做到这一点并避免错误(对于对象列类型)是应用 drop_duplicates()

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]
Run Code Online (Sandbox Code Playgroud)

您也可以使用 SQL 来执行此操作,但在我的情况下它的运行速度非常慢:

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)
Run Code Online (Sandbox Code Playgroud)


Nai*_*ade 10

我认为drop duplicate有时使用根据数据框不会那么有用。

我找到了这个:

[in] df['col_1'].unique()
[out] array(['A', 'B', 'C'], dtype=object)
Run Code Online (Sandbox Code Playgroud)

并为我工作!

https://riptutorial.com/pandas/example/26077/select-distinct-rows-across-dataframe


nco*_*lan 10

为了解决类似的问题,我正在使用groupby

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

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


EdC*_*ica 7

没有uniquedf的方法,如果每列的唯一值的数量相同,则以下方法将起作用: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)}
Run Code Online (Sandbox Code Playgroud)