我仍然是初学者,所以不要刻苦判断。我正在尝试了解如何解决此问题,而不是从您那里获取完整的代码。
我有一个数据库,该数据库的格式如下,大约有9000行
Location Supplier Product Price
NY GG-10 70 $5
NY GG-10 7A $4
NY GG-10 80 $6
NY GG-10 8A $8
TX GX-05 70 $1
TX GX-05 80 $3
TN CX-01 70 $4
TN CX-01 7A $5
我已将此数据框上传到我的pandas项目,现在试图弄清楚如何获取python来显示缺少价格的商品。例如,供应商GG-10对所有4种商品(70,7A,80,8A)都有定价。 GX-05仅定价2件(70,80),但缺少7A和8A。 CX-01缺少80和8A。所以基本上我需要一个数据框,该框将向我显示哪些供应商-产品组合缺少价格。您可能知道,只有4种产品-70、7A,80、8A。
我想自己编写代码,但是如果有人可以给我提示如何实现这一点,那就太好了!手动进行这项工作将永远带我
更新的输出。由于某些原因,.dot不能将列包装到一个单元格中
Product 70 7A 80 8A
Location Supplier
NY GG-10 1 1 1 1
TX GG-05 1 0 1 0
TN CX-01 1 1 0 0
答案 0 :(得分:1)
尝试使用crosstab
,频率显示为0表示丢失,那么我们可以使用dot
将它们组合到单元格中
s=pd.crosstab(df.Supplier,df.Product)
s.eq(0).dot(s.columns+',').str[:-1]
Out[669]:
Supplier
CX-01 80,8A
GG-10 # blank here means nothing missing
GX-05 7A,8A
dtype: object
更新:更新原因,请参阅OP的注释
s=pd.crosstab([df.Location ,df.Supplier],df.Product)
s.eq(0).dot(s.columns+',').str[:-1] # here need to assign it back
s=s.eq(0).dot(s.columns+',').str[:-1] # adding this line
s
Out[671]:
Location Supplier
NY GG-10
TN CX-01 80,8A
TX GX-05 7A,8A
dtype: object
答案 1 :(得分:1)
您可以找到设置差异
product = [ '70', '7A', '80', '8A']
df.groupby('Supplier').Product.apply(lambda x: set(product).difference(set(x)))
Supplier
CX-01 {80, 8A}
GG-10 {}
GX-05 {7A, 8A}