我正在尝试基于多个过滤条件来获取Pandas数据框中特定列的唯一值。这是一些玩具代码:
df = pd.DataFrame({'Manufacturer':['<null', 'Mercedes', 'BMW', 'Audi', 'Audi', 'Audi', 'Audi', 'Audi', 'Mercedes', 'BMW'],
'Color':['Purple', '<null>', '<null>', 'Blue', 'Green', 'Green', 'Black', 'White', 'Gold', 'Tan']})
我正在尝试获取Color
列的唯一值的列表,假设:
a)在Color
列中为非空值,并且
b)Manufacturer
列中的值'Audi'
是否有Python方式不需要我通过获取数据帧的子集来“预处理”数据,例如:
df_1 = df[(df['Color'] != '<null>') & (df['Manufacturer'] == 'Audi')]
df_1['Color'].unique()
array(['Blue', 'Green', 'Black', 'White'], dtype=object)
谢谢!
答案 0 :(得分:1)
您必须使用所需条件对数据框进行子集化。没有逃避。
您始终可以用1行代码编写代码,如下所示:
df[(df['Color'] != '<null>') & (df['Manufacturer'].eq('Audi'))]['Color'].unique()
此外,很高兴用null
表示数据帧中的numpy.nan
值。您的df
将是这样:
In [86]: import numpy as np
In [81]: df = pd.DataFrame({'Manufacturer':[np.nan, 'Mercedes', 'BMW', 'Audi', 'Audi', 'Audi', 'Audi', 'Audi', 'Mercedes', 'BMW'],
...: 'Color':['Purple', np.nan, np.nan, 'Blue', 'Green', 'Green', 'Black', 'White', 'Gold', 'Tan']})
然后,您可以使用df.notna()
和df.eq
,它们更具Pythonic:
In [85]: df[df.Color.notna() & df.Manufacturer.eq('Audi')]['Color'].unique()
Out[85]: array(['Blue', 'Green', 'Black', 'White'], dtype=object)
可以使用isin
指定多个值:
df[(df['Color'] != '<null>') & (df['Manufacturer'].isin(['Audi', 'Mercedes']))]['Color'].unique()