Python:分组数据的多个过滤器

时间:2018-11-03 21:26:42

标签: python excel pandas

我正在尝试过滤下面的列表,以仅显示具有相同供应商,相同质量(可以是无限数量的评级),但类型(仅两个不同值)的订单项。

例如,我可以使用供应商ABC A等级的木材或钢,但不能与供应商DEF进行相同的切换(假定木材和钢的质量不同)。所需的输出将是一个仅显示ABC的A级钢材和木材和GHI的B级钢材和木材的表。

我想出了如何只显示提供木材和钢材的供应品(即取消了JKL),却无法弄清楚如何进一步筛选以显示具有不同类型但质量相同的供应商。

df.groupby('Supplier').filter(lambda x:x['Type'].nunique()>1)

任何帮助将不胜感激!

输入数据:

  Supplier Quality   Type
0      ABC       A   Wood
1      ABC       B  Steel
2      ABC       A  Steel
3      DEF       B  Steel
4      DEF       A   Wood
5      GHI       C   Wood
6      GHI       A   Wood
7      GHI       A  Steel
8      JKL       A   Wood
9      JKL       A   Wood

3 个答案:

答案 0 :(得分:1)

只需按供应商和质量分组:

df.groupby(['Supplier', 'Quality']).filter(lambda x: x['Type'].nunique() > 1)

  Supplier Quality   Type
0      ABC       A   Wood
2      ABC       A  Steel
6      GHI       A   Wood
7      GHI       A  Steel

答案 1 :(得分:0)

根据您尝试的结果,您正在寻找比1更好的唯一类型,因此您可以执行以下操作:

df2 = df.groupby(['Supplier', 'Quality'])['Type'].unique().to_frame()
df2[df2['Type'].str.len() >1]


                       Type
Supplier    Quality 
ABC            A    [Wood, Steel]
GHI            A    [Wood, Steel]

答案 2 :(得分:0)

一种方法是将drop_duplicatesduplicatedkeep=False一起使用:

key_cols = ['Supplier', 'Quality']

res = df.drop_duplicates().loc[:, key_cols]

res = res.loc[res.duplicated(keep=False)]\
         .drop_duplicates()

print(res)

  Supplier Quality
0      ABC       A
6      GHI       A