我正在尝试在pandas数据框中创建一个新列,以将来自另一个符合特定条件的数据框中的值连接起来。
如果我有数据框库存和产品作为输入:
Inventory
Category All_SKU
Apple NaN
Banana NaN
Oranges NaN
Products
Product Category SKU
Macintosh Apple 4123
Gala Apple 4356
Navel Oranges 5897
Cara Cara Oranges 5324
Red Delicious Apple 4896
Cavendish Banana 7895
我希望输出为
Inventory
Category All_SKU
Apple 4123; 4356; 4896
Oranges 5897; 5324
Banana 7895
我已经尝试过这种方法(和其他方法),但是遇到一个关键错误。不知道这是最好的方法还是有更好的方法来解决这个问题。
for row in Products.index:
InvRow=Inventory.index[Inventory['Category'] == Products['Category',row]]
Inventory['All_SKU',InvRow]=Inventory['All_SKU',InvRow] + "; "+ Products['SKU',row]
答案 0 :(得分:0)
类似的事情应该做
Products.groupby('Category').SKU.apply(lambda x: ';'.join(list(str(i) for i in list(x))))
但是如果我是你,我会使用列表而不是字符串
答案 1 :(得分:0)
您可以使用分组方式,如下所示
df = pd.DataFrame([['Macintosh', 'Apple', '4123'], ['Gala', 'Apple', '4356'], ['Navel', 'Oranges', '5897'], ['Cara Cara', 'Oranges', '5324'], ['Red Delicious', 'Apple', '4896'], ['Cavendish', 'Banana', '7895']], columns=('Product', 'Category', 'SKU'))
result = df.groupby("Category")["SKU"].apply(list).str.join(";")
如果您希望将结果限制为库存数据表中的类别,则可以使用如下所示的合并
df_inventory.merge(df, on="Category")
答案 2 :(得分:0)
一个简单易懂的解决方案,适合像我这样的人,他们不会得到lambda和其他很酷的一线解决方案。
for d in Inventory['Category'].index:
cat= data['Category'][d]
data = Products.query(f"Category == '{cat}'", inplace = False)
t = data['SKU']
Inventory['All_SKU'][d] = t.tolist()
(我将它们存储为列表,而不是';'分隔的字符串。)
答案 3 :(得分:0)
您可以使用groupby.apply
+ Series.map
:
Inventory['All_SKU']=( Inventory['Category']
.map(products[products['Category'].isin(Inventory['Category'])]
.groupby('Category')['SKU']
.apply(lambda x: ','.join(x.astype(str)))) )
print(Inventory)
Category All_SKU
0 Apple 4123,4356,4896
1 Banana 7895
2 Oranges 5897,5324